zoukankan      html  css  js  c++  java
  • 折纸

    【问题描述】
    在非常紧张的NOIP 考试中,有人喜欢啃指甲,有人喜欢转铅笔,有人喜欢撕
    纸条,……而小x 喜欢迷折纸。
    现有一个W * H 的矩形纸张,监考老师想知道,小x 至少要折多少次才能使
    矩形纸张变成w * h 的矩形纸张。
    注意,每次的折痕都要平行于纸张的某一条边。
    【输入格式】
    第一行包括两个整数W,H。
    第二行包括两个整数w,h。
    【输出格式】
    输出一个整数,表示至少需要折的次数。若无解,则输出-1。
    【输入输出样例】
    Input1
    2 7
    2 2
    Output1
    2
    Input2
    5 5
    1 6
    Output2
    -1
    Input3
    10 6
    4 8
    Output3
    2
    【数据说明】
    对于20% 的数据满足:W = w 且H,h≤3。
    对于100% 的数据满足: 1 ≤ W,H,w,h ≤ 109 。

    思路:

    将本题翻译一下:给定两个数x1、y1,你每一次可以将其中一个数k最多减少k div 2(div表示整除),求至少要多少次可以变成x2,y2。

    其实这一题一看就是贪心,我先将x1,y1与x2,y2对应,再只要一个数比对应的数大,就减一次k div 2,然后ans++。代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 long long w,h,w1,h1,ans;
     4 int main()
     5 {
     6     cin>>w>>h>>w1>>h1;
     7     if((w1>w&&w1>h)||(h1>w&&h1>h)||(w<w1&&w<h1)||(h<h1&&h<w1))
     8     {
     9         cout<<-1<<endl;
    10         return 0;
    11     }
    12     if(w<h) swap(w,h);
    13     if(w1<h1) swap(w1,h1);
    14     while(w>w1)
    15     {
    16         w-=w/2;
    17         ans++;
    18     }
    19     while(h>h1)
    20     {
    21         h-=h/2;
    22         ans++;
    23     }
    24     cout<<ans<<endl;
    25     return 0;
    26 }

    (简单的贪心)

  • 相关阅读:
    ASP.NET中的ViewState
    (标记)Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 By 似水流年
    C#中类的定义
    苹果CMS搭建影视网站教程
    Java之冒泡排序
    Java之数组扩容
    Linux之netstat命令基本使用
    Linux之systemctl命令基本使用
    Oracle11g R2 安装教程(非常详细 )
    Linux之firewall防火墙开启和关闭
  • 原文地址:https://www.cnblogs.com/xinxiyuan/p/11191634.html
Copyright © 2011-2022 走看看