折纸
题目
【问题描述】
在非常紧张的 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 ≤9, 10 。
思路
注意到如果确定了哪条边作为 W,哪条边作为 H,两条边的次数是独⽴的,枚举作为 W 的边即可,比较后选出最优解。
代码
#include<bits/stdc++.h> using namespace std; int a,b,c,d,sum=0,sum1=0,a1,b1; int main() { freopen("folding.in","r",stdin); freopen("folding.out","w",stdout); cin>>a>>b; if(a>b) swap(a,b); a1=a;b1=b; cin>>c>>d; if(c>d) swap(c,d); if(d>b||c>a) { cout<<"-1"<<endl; return 0; } if(a<d) { while(a>c||b>d) { if(a<=c) { b=b/2; sum=sum+1; } else if(b<=d) { a=a/2; sum=sum+1; } else { a=a/2; b=b/2; sum=sum+2; } } cout<<sum<<endl; return 0; } while(a>c||b>d) { if(a<=c) { b=b/2; sum=sum+1; } else if(b<=d) { a=a/2; sum=sum+1; } else { a=a/2; b=b/2; sum=sum+2; } } while(a1>d||b1>c) { if(a1<=d) { b1=b1/2; sum1=sum1+1; } else if(b1<=c) { a1=a1/2; sum1=sum1+1; } else { a1=a1/2; b1=b1/2; sum1=sum1+2; } } if(sum1<sum) cout<<sum1<<endl; else cout<<sum<<endl; fclose(stdin);fclose(stdout); return 0; }