首页 > 其他 > 详细

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

时间:2014-08-30 01:17:18      阅读:363      评论:0      收藏:0      [点我收藏+]

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

三个轨道,一个库。分别是分钟单位的轨道,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\n",q[i]);

		printf("\n");*/
			
	}
	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",N,solve());
	}
    return 0;
}


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

原文:http://blog.csdn.net/gg_gogoing/article/details/38935015

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!