POj 1879 Tempus et mobilius Time and motion (模擬+群)
來源:程序員人生 發布時間:2014-09-08 10:00:56 閱讀次數:2796次
題目特別長,大意為球的傳遞。
三個軌道,一個庫。分別是分鐘單位的軌道,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;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈