计蒜客 folding

来源:互联网 发布:c语言心形图案代码下载 编辑:程序博客网 时间:2024/06/09 23:11

 folding

As you can remember, Alex is fond of origami. She switched from squares to rectangles, and rectangles are much more difficult to master. Her main interest is to determine what is the minimum possible number of folds required to transform W × H rectangle tow × h one. The result of each fold should also be rectangular, so it is only allowed to make folds that are parallel to the sides of the rectangle.

Help Alex and write a program that determines the minimum required number of folds.

Input

The first line of the input contains two integersW and H — the initial rectangle dimensions. The second line contains two more integersw and h — the target rectangle dimensions (1W, H, w, h10910^9109).

Output

Output a single integer — the minimum required number of folds to transform the initial rectangle to the target one.

If the required transformation is not possible, output1. 

样例输入1

2 72 2

样例输出1

2

样例输入2

10 64 8

样例输出2

2

样例输入3

5 51 6

样例输出3

-1


In the first example you should fold 2×7 rectangle to 2×4, and then to 2×2.
In the second example you should fold 10
×6 rectangle to 10×4, then to 8×4, and rotate it to 4×8.

In the third example it is impossible to fold 5× 5 rectangle to 1× 6 one (remember that folds must be parallel to the rectangle sides).



题意:
给定两个矩形的纸的长宽,问能否通过平行于边的折叠操作使第二个变成第一个的长宽,输出最小次数,否则输出 -1

思路:
长度为3的纸最多折叠成的长度为2,即最多减少了1。(3/2=1)
长度为4的纸最多叠成的长度为2,即最多减少了2。(4/2=2)
(奇数偶数最多减少的都是本身除以2)

所以可以循环每次减最大值(大于等于目标规格,使第一个变第二个),最后若减不了又不到则次数加一。
然后变化顺序再来一遍取最小值,因为不知道最佳搭配。

代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;#define INF 0x3f3f3f3fint main(){    int n,m;    int a,b;    scanf("%d%d",&n,&m);    scanf("%d%d",&a,&b);    if(n>m)swap(n,m);    if(a>b)swap(a,b);    int g=0,h=0;    if(a>n || b>m)printf("-1\n");    else    {        int ans=INF;        for(int i=0;i<2;i++)        {            if(i==1)                swap(n,m);                        g=0,h=0;            int maxn=n/2;            int nn=n;            while(nn-maxn>=a && n!=a && maxn!=0)            {                g++;                nn-=maxn;                maxn=nn/2;            }            if(nn>a)g++;                        maxn=m/2;            int mm=m;            while(mm-maxn>=b && m!=b && maxn!=0)            {                h++;                mm-=maxn;                maxn=mm/2;            }            if(mm>b)h++;                        ans=min(ans,g+h);        }                printf("%d\n",ans);    }    return 0;}