这个题就是简单模拟,有一个点是判断无解的情况,看到一份题解用floyd判环算法来判断,简单易懂, Ac代码
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int a[15],b[15],c[15],d[15]; int n; //下一分钟的状态 void next(int *arr) { int sleep = 0; for(int i = 0 ; i < n ; i++){ if(arr[i] > a[i]) sleep ++; } for(int i = 0 ; i < n ; i++) arr[i]++; for(int i = 0 ; i < n ; i++){ if(arr[i] == a[i] +1){ // 要睡觉 if(sleep * 2 <= n) arr[i] = 1; } if(arr[i] == a[i] + b[i] + 1) arr[i] = 1; } } //判断现在是否都清醒 bool check() { for(int i = 0 ; i < n ; i++){ if(c[i] > a[i]) return false; } return true; } int main() { int t = 1; while(cin >> n && n){ for(int i = 0 ; i < n ; i++){ cin >> a[i] >> b[i] >> c[i]; } memcpy(d,c,sizeof c); int ans = 1; if(!check()){ do{ next(c); ans++; if(check()) break; next(d); next(d); }while(memcmp(c,d,sizeof c) != 0); } if(!check()) ans = -1; printf("Case %d: %d\n",t++,ans); } return 0; }floyd判环算法参考:https://blog.csdn.net/u012534831/article/details/74231581
核心:问题:如何检测一个链表是否有环,如果有,那么如何确定环的起点?如何确定环的长度?
时间复杂度:O(n) (高效率) 空间复杂度:O(1) 此算法又成为龟兔赛跑算法,基本思想是:
好比两个人在赛跑,A的速度快,B的速度慢,经过一定时间后,A总是会和B相遇,且相遇时A跑过的总距离减去B跑过的总距离一定是圈长的n倍(初中数学题……)。
弗洛伊德(Floyd )使用了两个指针,一个慢指针(龟)每次前进一步,快指针(兔)指针每次前进两步(两步或多步效果是等价的,只要一个比另一个快就行。但是如果移动步数增加,算法的复杂度可能增加)。如果两者在链表头以外(不包含开始情况)的某一点相遇(即相等)了,那么说明链表有环,否则,如果(快指针)到达了链表的结尾(如果存在结尾,肯定无环),那么说明没环。