POJ1006

坑爹的数学题!
大体的意思就是:已知三个周期tq=23、te=28,ti=33!然后,一个case给你四个数,前三个q、e、i,对应已知的三个周期,是周期开始的时间,然后每个时间你需要输出从第四个数所代表的时间到三个时间经过若干个周期后相等的时间。(每个时间的周期数不要求相等,例如q经过了k1个周期,e经过了k2个周期,i经过了k3个周期使得q+k1*tq==e+k2*te==i+k3*ti)
因为我想了蛮久还没有头绪,自己本身解数学题的能力就不行,然后就进discuss看了看别人的想法,然后发现有人给出了他的算法:

把三个时间看做三个跑步的人,他们的初始位置由输入给定
他们的步距是已知的周期,然后第四个给定的时间是初始的目的地
然后进入循环
1:让他们每个人按周期先跑到大于等于目的地的位置
2:判断他们的位置是否相等,相等则输出answer,结束循环,否则转3
3:取他们三个的位置的最远处为新的目的地,转1

算法

简直佩服想出这个算法的人。。简洁明了的AC了。
然后用了这个算法,讨论区里好多人说的什么注意边界条件,注意特殊情况的问题都不存在了。。简直好。真心Orz想出这个算法的人。
以下是我的实现:

#include <cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
const int tp = 23, te = 28, ti = 33, MAX = tp*te*ti;
int main(int argc, char const *argv[])
{
    int p, e, i, d, cnt = 0;
while(scanf("%d%d%d%d", &p, &e, &i, &d)&&p!=-1&&e!=-1&& i!=-1){
        int des = d;
        while(p != e || e != i) {
            if(des<p || des<e || des<i)
                des = max(max(p, e), i);
            while(p<des && (p+=tp));
            while(e<des && (e+=te));
            while(i<des && (i+=ti));
        }
        printf("Case %d: the next triple peak occurs in %d days.\n", ++cnt, (p-d+MAX-1)%MAX+1);
    }
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值