HNUST-OJ-1690-千纸鹤

题目描述:

圣诞节快到了,校园里到处弥漫着粉红色的气息。又是一个情侣秀恩爱的节日。
作为一只在双十一剁手的单身狗,XX只能望着空荡荡的钱包欲哭无泪。

XX琢磨着,得趁圣诞节的时候赚点外快,不然真得喝西北风去了。

但是能赚什么外快呢?批发苹果?没本金;卖贺卡?没本金;许愿灯?还是没本金……想来想去,做什么都没!本!金!这个残酷的世界啊,还给不给单身狗活路了!!!

最后还是心灵手巧,多才多艺的室友给了XX灵感——对,没错,就是题目——千纸鹤!

和其他的比起来,千纸鹤成本低廉到可以忽略不计。而最丧心病狂的是,XX为了节约成本,她都没直接去买可以叠千纸鹤的方块纸,而是自己买了白纸回来裁!!

而XX那奇葩的审美,让她觉得千纸鹤折越大越好看。所以她裁剪的时候,都是裁一块最大面积的正方形出来折千纸鹤。然后下一次又在剩余的纸中继续裁一块最大的正方形。

那么问题来了,一块长a宽b的长方形纸,在折完k只千纸鹤以后,还剩多大?

例如长为7宽为3的纸片,折完3只千纸鹤后,剩下的纸片为长2宽1。

 输入:

输入只有一行,包括三个整数 a, b, k (0 < b <= a <= 10,000),分别表示纸片的长,宽,以及千纸鹤的个数。保证数据合法。

输出:

输出一行运算结果,结果为两个整数,分别表示剩余白纸的长和宽,数字以空格隔开,末尾要换行(长 >= 宽)。

样例输入:

1 1 1

样例输出:

 0 0

解题思路:

 虽然前面的情景描述看起来冗长没用(确实有些冗长,也确实没用),但这题的解体想法却一点不冗长。

假设已知长方形的长为a,宽为b。

想要使得到的正方形达到最大值,即要将长方形的宽b作为新正方形的边长,那么经过裁剪后得到的新长方形其中两条边长为k=a-b,另外两条边长为依然为a。

这个时候就要分情况考虑了。

一种是k>b的时候,那么我们就将k赋给长a,宽b依然为b。

另一种则是k<=b的时候,那么我们就将原宽b作为新长方形的长a,将k作为新长方形的b。

值得注意的是,但其中一条边变为零的时候,另一条边也将变成零(即样例输入和样例输出)

 实现代码:

#include<stdio.h>
int main(void)
{
    int a,b,k;
    scanf("%d%d%d",&a,&b,&k);
    while(k--)
    {int k=a-b;
        if(k>b)
        {
            a=k,b=b;
        }
        else
        {
            a=b;
            b=k;
        }
    }
    if(b==0)a=0;//也可以放到上面的循环内,当其中一条边为0时,就break
    printf("%d %d",a,b);



}

上一篇:LeetCode第 278 场周赛


下一篇:HNUST OJ 2287 寻找厄咒图腾