您的位置:首页 > 其它

GYM 101142 F.Folding(贪心)

2018-01-21 10:13 357 查看
Description

给出一张W×H的折纸,问最少折叠多少次可以将其变成一个w×h的纸

Input

四个整数W,H,w,h(1≤W,H,w,h≤109)

Output

如果存在合法方案则输出最少折叠次数,否则输出−1

Sample Input

2 7

2 2

Sample Output

2

Solution

首先考虑是否需要旋转,枚举旋转不旋转两种情况,之后两边的折叠就互不影响了,问题变成最少次数将a变成b,每次的操作是找到x,把a变成max(x,a−x),贪心的尽量二分折即可,只要a≤2b则折叠一次即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
int Solve(int a,int b)
{
if(a==b)return 0;
if(a>=2*b)return 1+Solve((a+1)/2,b);
return 1;
}
int main()
{
freopen("folding.in","r",stdin);
freopen("folding.out","w",stdout);
int a,b,c,d;
while(~scanf("%d%d%d%d",&a,&b,&c,&d))
{
int ans=INF;
if(a>=c&&b>=d)ans=min(ans,Solve(a,c)+Solve(b,d));
if(a>=d&&b>=c)ans=min(ans,Solve(a,d)+Solve(b,c));
if(ans==INF)printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: