【问题描述】
在非常紧张的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 }
(简单的贪心)
来源:https://www.cnblogs.com/xinxiyuan/p/11191634.html