hdu acm-step 2.1.4 Cake

 本题题意:参加party的人可能有p或q,问怎样切蛋糕,能满足两种情况,并使蛋糕的块数最少。

 代码如下:

 

#include <cstdio>
using namespace std;
int gcd(int a,int b)
{
        int r;
        while(b)
        {
                r = a%b;
                a = b;
                b = r;
        }
        return a;
}
int main(void)
{
        int p,q;
        while(scanf("%d%d",&p,&q)!=EOF)
        {
                if(p < q){int t=p;p=q;q=t;}
                printf("%d\n",p+q-gcd(p,q));
        }
        return 0;
}

(考虑p > q)其实这个还蛮烧脑的,切蛋糕的话,其中最大块的体积肯定是1/p,剩下的就是怎么切这p块蛋糕能够使蛋糕的块数最少呢,下面给个例图:

假设p=6,q=4,那么就如上图所示,切割痕迹重合后的线条数就是最小的切割次数。4与6的最大公约数是2,也就是说有一条线会重合,见上图。

而4和6的切割线数量分别是3和5,二者之和减去重合的那条线结果就是7条分割线,而7条线便将蛋糕分成了8块。

再看8和4,分割线是7和3,重合数是最大公约数减1为3,因此由(p+q-2)-gcd(p,q)-1得到不重合的切割线数是7,即最小块数为8。

由此可见,用几何思维来思考还是很重要的,单纯去想的话,真的是很累。。。

 

posted @ 2017-08-20 10:51  mtl6906  阅读(119)  评论(0编辑  收藏  举报