坑爹的数学题!
大体的意思就是:已知三个周期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;
}