以前做过,那时题目看得半懂不懂的。。。。原来这么水,囧~
运用数论的知识应该还可以优化。但信安数学基础学的不好啊,同余用不上。囧~
貌似用中国剩余定理可以做 = =
程序设计导演上面的解法也是不错的。。。。嘛
16ms = =!!
我的也要94ms....囧死
#include“cstdio”
int main()
{
int p,e,i,d,count = 1;
while(scanf("%d%d%d%d",&p,&e,&i,&d) && p != -1){
int res = 0;
for(int k = 0;k < 700;k ++){
i %= 33; //这里wa了一次。囧~
res = i + 33 * k; //取最大的除数33,效率比较高
if(!((res - e) % 28) && !((res - p) % 23) && res > d){
printf("Case %d: the next triple peak occurs in %d days.\n",count,res - d);
count ++;
break;
}
}
}
return 0;
}
优化算法:
while(scanf("%d%d%d%d", &p, &e, &i, &d) && p!=-1){
for(j=d+1; j<21252; j++)
if ((j-p)%23 == 0) break;
for( ; j<21252; j=j+23)
if ((j-e)%28 == 0) break;
for( ; j<21252; j=j+23*28)
if ((j-i)%33 == 0) break;
}
3个for...怎么就快了 = =
改进后的算法好聪明!
回复删除