折纸

题目

【问题描述】
在非常紧张的 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;
}
原文地址:https://www.cnblogs.com/abcdhh/p/11191530.html