課堂上有n個學生(n<=10),每一個學生上課都會出現一個「清醒-睡眠」週期,其中第i個學生學習Ai分鐘後睡眠Bi分鐘,依次重複。其中在從清醒到睡眠時有一個條件:只有到全班睡眠人數大於清醒人數時,這個學生纔敢睡覺。
題目使用(A,B,C)來描述一個學生的信息,A是該學生的清醒時間,B是該學生的睡眠時間,C是該學生的初始狀態值(即在初始時是這個週期的第幾分鐘)
問通過多久,全部人都清醒,固然也可能不存在這個時間,就輸出-1.
3 學生人數 2 4 1 清醒2分鐘 睡眠4分鐘 初始狀態是在週期第1分鐘 1 5 2 清醒1分鐘 睡眠5分鐘 初始狀態是在週期第2分鐘 1 4 3 清醒1分鐘 睡眠4分鐘 初始狀態是在週期第3分鐘
3 學生人數 2 4 1 清醒2分鐘 睡眠4分鐘 初始狀態是在週期第1分鐘 1 5 2 清醒1分鐘 睡眠5分鐘 初始狀態是在週期第2分鐘 1 4 3 清醒1分鐘 睡眠4分鐘 初始狀態是在週期第3分鐘 3 1 2 1 1 2 2 1 2 3 0
Case 1: 18 Case 2: -1
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string> #define CLASSTIME 1000000 //設置課程時間最大 int sNum; //學生人數1-10 int a[11], b[11], c[11]; //記錄各個學生的初始信息
int getStuInfo() { scanf("%d", &sNum); if (!sNum) return 0; getchar(); for (int i = 1; i <= sNum; i++) { scanf("%d %d %d", &a[i], &b[i], &c[i]); getchar(); } return 1; }
int getRealStuTime() { int count; for (int i = 1; i < CLASSTIME;i++) { count = 0; for (int j = 1; j <= sNum; j++) //先獲取睡覺人數 if (c[j] > a[j]) //在睡覺 count++; if (count == 0) //所有在學習 return i; for (int j = 1; j <= sNum; j++) //更新狀態 { if (c[j] == a[j] + b[j] || (c[j] == a[j] && count < sNum - count)) //一個週期 或者 若是睡覺人數少於學習人數,則不敢睡覺,開始從新學習 c[j] = 0; c[j]++; //更新每一個學生的狀態 } } return -1; }
void main() { int n = 1; FILE* fp = freopen("data8.in", "r", stdin); freopen("data8.out", "w", stdout); while (getStuInfo()) printf("Case %d: %d\n", n++, getRealStuTime()); freopen("CON", "r", stdin); freopen("CON", "w", stdout); }