国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > POj 1879 Tempus et mobilius Time and motion (模拟+群)

POj 1879 Tempus et mobilius Time and motion (模拟+群)

来源:程序员人生   发布时间:2014-09-08 10:00:56 阅读次数:2684次

题目特别长,大意为球的传递。

三个轨道,一个库。分别是分钟单位的轨道,5min单位的轨道,一小时单位的轨道,还有就是n容量的库。每过一分钟,一个小球从库里面出来,库符合先进先出,进入分钟轨道,如果分钟轨道里面已经有了4个,那么这四个就滑入库,而这个球则进入5min轨道,如果5min轨道已经有了11个,这11个就滑入库,而这个球则滑入小时轨道,如果小时轨道已经有了11个,则这11个滑入库,这个球最后滑入库。在轨道中的球滑入库中,轨道里的球满足先进后出。如此,轨道是栈,库是队列。而且模拟过程也出来了。暴力会爆


这个题目

提升了我的调试能力。

1. 大规模数据用freopen输入输出,再用UE等软件对比diff,找到问题后再调试

2.中途设置条件输出。


#include <iostream> #include <cstdio> #include <vector> #include <string> #define maxn 1005 using namespace std; int N,M; int a[200]; int q[60*24*10]; int Mstack[3][20];//sec min hou int top[3]; int vis[200]; int head,tail; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int solve() { int i,j,k,flag; int cnt,ans; for(i=1;i<=N;i++) q[i]=a[i]=i; head=1;tail=N+1; memset(top,0,sizeof(top)); memset(vis,0,sizeof(vis)); for(j=tail,i=1;i<=60*24;i++) { if(top[0]==4){ for(k=0;k<4;k++) q[j++]=Mstack[0][--top[0]]; if(top[1]==11){ for(k=0;k<11;k++) q[j++]=Mstack[1][--top[1]]; if(top[2]==11){ for(k=0;k<11;k++) q[j++]=Mstack[2][--top[2]]; q[j++]=q[i]; }else Mstack[2][top[2]++]=q[i]; }else Mstack[1][top[1]++]=q[i]; }else Mstack[0][top[0]++]=q[i]; /*if(i>=720) printf("%d ",q[i]); printf(" ");*/ } ans=1; for(j=i;j<N+i;j++) { if(vis[j-i+1]==0) { vis[j-i+1]=1; k=q[j]; cnt=1; while(vis[k]==0) { cnt++; vis[k]=1; k=q[i+k-1]; } ans=ans/gcd(ans,cnt)*cnt; } } return ans; } int main() { //freopen("E:out.txt","w",stdout); while(scanf("%d",&N),N) { printf("%d balls cycle after %d days. ",N,solve()); } return 0; }


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生