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
给出一张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; }
相关文章推荐
- Codeforces Gym 101142 F. Folding
- 贪心——Playing with numbers ( Gym 101061 E )
- 贪心 Gym 100502E Opening Ceremony
- Gym 100886J Sockets(二分+贪心)
- Gym 100345G Pulp Fiction 贪心
- Gym 100531B Buffcraft (贪心+暴力+前缀和)
- Codeforces Gym 100203E bits-Equalizer 贪心
- GYM-100796C-Minimax Tree【贪心】
- Gym 100507H Pair: normal and paranormal (贪心)
- Gym 100801G Graph(贪心构造)
- Gym - 100801G: Graph (贪心+set+拓扑)(好题)
- Gym - 101173J Jazz Journey 图论、枚举贪心、Interesting
- Gym 101572 K.Kayaking Trip【二分+贪心】
- Codeforces Gym 100803C Shopping 贪心
- Gym 100712E 贪心
- hd 5695 Gym Class(拓扑排序+贪心)
- codeforce Gym 100685E Epic Fail of a Genie(MaximumProduction 贪心)
- Codeforces Gym - 101341A Streets of Working Lanterns - 2 [贪心]
- Gym 100187F (贪心+覆盖)
- Gym - 100623K-贪心&进制