zoukankan      html  css  js  c++  java
  • HDU 1722 Cake

      这道题有一个简单的思路 就是  a+b-gcd(a,b);

      

      另一种就是就是递归求解。

      (1) 当Max == Min时,显然蛋糕要均匀的要分成Max(Min)份。

      (2)当 Max != Min 时,设m = Max/gcd(Max,Min)*Min;

         此时应该将蛋糕的 (Min*Min)/m 部分分成 Min份,即每份Min/m = Min*Min*gcd(Min,Max)/Max。

        把剩下的部分看成一个新的蛋糕去均匀的分给Min和Max-Min个人。

        直到Min == Max-Min,递归结束。

      当剩下的部分分成的份数可以均匀的分给Min 和 Max-Min个人时候,整个蛋糕可以均匀分给Max和Min个人。

        所以只需要不断的递归调用第二步,直到符合第一步的条件。

      

      当剩下的部分 有:

        1 - (Min*Min)/m = (Max-Min^3*gcd(Max,Min) ) / Max

        分成Max-Min份时有 每份为 Min*Min*gcd(Min,Max)/Max

        显然此时 Max 个人分得的蛋糕是一样的。

        当均匀地分成Min份 设 每份为 X 则 Min个人 每人分得Min*Min*gcd(Min,Max)/Max + x 的蛋糕。

        显然此时 Min个人分得的蛋糕也是一样的。

     1 #include <iostream>
     2 
     3 #define LL long long int
     4 
     5 using namespace std;
     6 
     7 int gcd(int p,int q)
     8 {
     9     if(q == 0)
    10         return p;
    11     return gcd(q,p%q);
    12 }
    13 
    14 void swap(LL &a,LL &b)
    15 {
    16     LL temp;
    17     temp = a;
    18     a = b;
    19     b = temp;
    20 }
    21 
    22 LL sum;
    23 
    24 void cal(LL a,LL b)
    25 {
    26     if(a == b)
    27     {
    28         sum += a;
    29         return ;
    30     }
    31     if(a < b)
    32     {
    33         swap(a,b);
    34     }
    35     sum += b;
    36     cal(b,a-b);
    37 }
    38 
    39 int main()
    40 {
    41     LL Min,Max;
    42 
    43     while(cin>>Min>>Max)
    44     {
    45         sum = 0;
    46         cal(Min,Max);
    47         cout<<sum<<endl;
    48     }
    49 
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    linux c dlopen加载动态链接库
    c++锁 测试 (gcc test.cpp -o test -lpthread)
    shell 清理目录下 超过一段时间的数据。
    大话存储学习笔记
    python总结
    正则表达式使用
    #linux shell#模拟日志生成过程
    深入理解Java虚拟机
    Nginx修改access.log日志时间格式
    mfcs100d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined
  • 原文地址:https://www.cnblogs.com/zmx354/p/3299604.html
Copyright © 2011-2022 走看看