折纸

【问题描述】
在非常紧张的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 }

(简单的贪心)

posted @ 2019-07-15 21:25  人之常路  阅读(388)  评论(0编辑  收藏  举报