Gym 101142F Folding

Folding

题意:
给你一张矩形的尺寸为W x H的纸,问最少折多少次能够折成一个w x h的纸。
(折纸的时候只能平行折)

思路:
先判断是否能够折出一个w x h的纸,若长边大于长边,短边大于短边,则可以实现,否则不行。
接下来我一开始想的是长边的往长边折,短边的往短边折,结果总是WA。
后来想想不能这样,如果短边和目标长边相等,长边又能只折一次就得到短边,答案是更优的。
那我们只要再算一次长边折到短边,短边折到长边的情况,然后比较一下大小就可以了。

代码:

#include<bits/stdc++.h>
#define maxn 10000000
#define ll long long
using namespace std;
ll llog[maxn];
void init()
{
    llog[0]=0;
    llog[1]=1;
    for(ll i=2;i<maxn;i++)
    {
        if(((i)&(i-1))==0) llog[i]=llog[i-1]+1;
        else llog[i]=llog[i-1];
    }
}
ll W,H,w,h;
int main()
{
    //init();
    FILE *in,*out;
    in=fopen("folding.in","r");
    out=fopen("folding.out","w");
    while(~fscanf(in,"%lld%lld%lld%lld",&W,&H,&w,&h))
    {
        if(max(W,H)<max(w,h)||min(W,H)<min(w,h)) fprintf(out,"-1\n");
        else
        {
            double a,b,c,d;
            a=(double)max(W,H);
            b=(double)min(W,H);
            c=(double)max(w,h);
            d=(double)min(w,h);
            //printf("%f %f %f %f \n",a,b,c,d);
            ll r1,r2;
            for(r1=0;;r1++)
            {
                if(a<=c) break;
                a/=2;
            }
            for(r2=0;;r2++)
            {
                if(b<=d) break;
                b/=2;
            }
            ll res1=r1+r2,res2=2000000000;
            a=(double)max(W,H);
            b=(double)min(W,H);
            c=(double)max(w,h);
            d=(double)min(w,h);
            if(b>=c)
            {
                for(r1=0;;r1++)
                {
                    if(a<=d) break;
                    a/=2;
                }
                for(r2=0;;r2++)
                {
                    if(b<=c) break;
                    b/=2;
                }
                res2=r1+r2;
            }
            fprintf(out,"%lld\n",min(res1,res2));
        }
    }
    fclose(in);fclose(out);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值