• 折纸


    题目

    【问题描述】
    在非常紧张的 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;
    }
  • 相关阅读:
    spring-security原理
    win10忘记密码,重置密码
    ELK环境搭建
    Centos8.2安装docker
    pgsql重启
    什么是网站跳出率
    随记
    javascript中apply、call和bind的区别
    Android与Mysql服务器通信
    CentOS 7 最小化安装之后安装Mysql
  • 原文地址:https://www.cnblogs.com/abcdhh/p/11191530.html
Copyright © 2020-2023  润新知