UVA 239 - Tempus et mobilius. Time and motion(置换周期)

UVA 239 - Tempus et mobilius. Time and motion

题目链接

题意:这题题意也是吊得飞起,看了老半天,大概是这样:

有一个放球的队列,和3个轨道(说白了就是栈),一个容纳5,1个12,1个12,每1分钟队列出一个小球,放入栈,如果放入5的满了,就把5的放回队列,头一个放入12的,如果12的满了,就把12的放回队列,头一个放入另一个12的栈,如果又满了,就全部放回队列(头一个最后放回),问多少天之后,队列中小球会回复原来的状态

思路:先是模拟求出一天的情况,对应一个置换,然后就是求置换中循环的最大公倍数即可了

代码:

#include <stdio.h>
#include <string.h>
#include <queue>
#include <stack>
using namespace std;

const int N = 7005;
int n, next[N], vis[N];

long long gcd(long long a, long long b) {
	if (!b) return a;
	return gcd(b, a % b);
}

long long lcm(long long a, long long b) {
	return a / gcd(a, b) * b;
}

int main() {
	while (~scanf("%d", &n) && n) {
		queue<int> Q;
		stack<int> mins, fives, hours;
		for (int i = 0; i < n; i++)
			Q.push(i);
		for (int t = 0; t < 1440; t++) {
			int now = Q.front();
			Q.pop();
			if (mins.size() == 4) {
				for (int i = 0; i < 4; i++) {
					Q.push(mins.top());
					mins.pop();
    			}
    			if (fives.size() == 11) {
    				for (int i = 0; i < 11; i++) {
    					Q.push(fives.top());
    					fives.pop();
        			}
        			if (hours.size() == 11) {
        				for (int i = 0; i < 11; i++) {
        					Q.push(hours.top());
        					hours.pop();
            			}
            			Q.push(now);
           			}
           			else hours.push(now);
       			}
       			else fives.push(now);
   			}
   			else mins.push(now);
  		}
  		for (int i = 0; i < n; i++) {
  			next[i] = Q.front();
  			Q.pop();
		}
		memset(vis, 0, sizeof(vis));
		long long ans = 1;
		for (int i = 0; i < n; i++) {
			if (!vis[i]) {
				long long cnt = 1;
				vis[i] = 1;
				int t = next[i];
				while (!vis[t]) {
					cnt++;
					vis[t] = 1;
					t = next[t];
    			}
       			ans = lcm(ans, cnt);
   			}
  		}
  		printf("%d balls cycle after %lld days.\n", n, ans);
 	}
	return 0;
}

UVA 239 - Tempus et mobilius. Time and motion(置换周期),布布扣,bubuko.com

时间: 2024-12-29 07:15:57

UVA 239 - Tempus et mobilius. Time and motion(置换周期)的相关文章

uva 239 - Tempus et mobilius. Time and motion(置换)

题目连接:uva 239 - Tempus et mobilius. Time and motion 题目大意:古代有一个计时器,由n个编号从1~n的球组成,然后有三个轨道,分别对应的是1分钟,5分钟,1小时,例如各个轨道都有一个球的时间为1小时6分钟.计时器的工作原理是每一分钟从球堆里滚出一个球到1分钟的轨道上(球堆是一个队列),特殊情况是1分钟的轨道上有了4个球,再进1个球的话就表示5分钟,所以这个球要滚到5分钟的轨道上,并且要将1分钟轨道上的球按照后进先出的顺序放回球堆的末尾. 对应的5分

UVA 239 - Tempus et mobilius. Time and motion(更换周期)

UVA 239 - Tempus et mobilius. Time and motion 题目链接 题意:这题题意也是吊得飞起,看了老半天,大概是这样: 有一个放球的队列.和3个轨道(说白了就是栈),一个容纳5,1个12,1个12,每1分钟队列出一个小球.放入栈.假设放入5的满了.就把5的放回队列,头一个放入12的.假设12的满了,就把12的放回队列.头一个放入还有一个12的栈,假设又满了.就所有放回队列(头一个最后放回),问多少天之后.队列中小球会回复原来的状态 思路:先是模拟求出一天的情况

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

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

poj 1879 Tempus et mobilius Time and motion

本题链接:点击打开链接 本题大意: 有一计时器,由编号从1到n的球组成,有三个轨道,分别对应1分钟,5分钟,1小时.此三个轨道可认为是栈,每分钟从球堆里出来一个球,球堆可认为是队列,三个轨道的容纳量分别是4,11,11.球首先进入的是1分钟轨道,当第五个球进入时,一分钟轨道的球全部出栈,进入球队列.而第五个球进入5分钟轨道,5分钟轨道满后再进的球进入小时轨道,5分钟轨道的球全部出栈进入球队列.小时轨道满了也是如此.此时经过半天.问:经过多少天球回归到原始状态. 解题思路: 每半天球完成一次序列交

UVa 10116 - Robot Motion

题目:有一个地图,地图上有运行的规则(移动到东西南北四个方向),现在给你起始点,求最后的状态. 分析:模拟.直接从起始点出发,按照地图的规则移动即可.记录每个点到达时走的步数,计算环. 说明:这题目也很眼熟(⊙_⊙). #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; char maps[100][100]; int

UVA之1398 - Meteor

[题目] The famous Korean internet company nhn has provided an internet-based photo service which allows The famous Korean internet company users to directly take a photo of an astronomical phenomenon in space by controlling a high-performance telescope

uva 704

自己之前的不见了.. 这题是双向广搜即可过.. 1 // Colour Hash (色彩缤纷游戏) 2 // PC/UVa IDs: 110807/704, Popularity: B, Success rate: average Level: 3 3 // Verdict: Accepted 4 // Submission Date: 2011-08-28 5 // UVa Run Time: 0.048s 6 // 7 // 版权所有(C)2011,邱秋.metaphysis # yeah

Fast Matrix Operations(UVA)11992

UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素add上val: 2 x1 y1 x2 y2 val 表示将(x1,y1,x2,y2)(x1<=x2,y1<=y2)子矩阵中的所有元素set为val: 3 x1 y1 x2 y2 val 表示输

UVa 568 Just the Facts

A过去后看了一下别人的解法,发现除了打表还有一种数论的方法. 分析一下阶乘后面的0是怎么出现的呢,当然是2乘5得到的. 我们将1~N先放在一个数组里面. 从数组第一个元素开始,先统计一下N!中因子为5的个数记为count,将其除去,然后再除去count个2.这样一来的话把所有元素乘起来后就不会出现10的倍数了. 当然并不是真正的乘起来,那样的话肯定是要溢出的,因为只关心最后一位数,所以每次乘完后求10的余数即可. 我的做法是打表,因为题目里给了N <= 10000的条件限制,所以可以把1~100