【习题 4-8 UVA - 12108】Extraordinarily Tired Students
【链接】 我是链接,点我呀:)
【题意】
【题解】
一个单位时间、一个单位时间地模拟就好。 然后对于每个人。 记录它所处的周期下标idx 每个单位时间都会让每个人的idx++ 注意从醒着到睡着的分界线的处理就好。可以多循环几次。。超过上限认为无解
(其他题解也提供了一种方法,就是如果状态和初始的情况相同的话。就无解了即形成了一个环。
(可能如果无解一定会形成环?
【代码】
#include <bits/stdc++.h>
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;
const int N = 10;
int n;
int a[N+10][N+10];
int cur[N+10],tot[N+10];
int main()
{
//freopen("D:\\rush.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0);
int kase = 0;
while (cin >> n){
if (n==0) break;
rep1(i,1,n){
int x,y;
cin >> x >> y >> cur[i];cur[i]--;
rep1(j,1,x) a[i][j-1] = 1;
rep1(j,x+1,x+y) a[i][j-1] = 2;
tot[i] = x+y;
}
cout<<"Case "<<++kase<<": ";
rep1(kk,1,10000){
int sleep = 0,wake = 0;
rep1(i,1,n){
if (a[i][cur[i]]==1) wake++;else sleep++;
}
if (sleep==0){
cout<<kk<<endl;
break;
}
rep1(i,1,n){
if (a[i][cur[i]]==1 && a[i][(cur[i]+1)%tot[i]]==2){
if (sleep>wake){
cur[i] = (cur[i]+1)%tot[i];
}else{
cur[i] = 0;
}
}else{
cur[i] = (cur[i]+1)%tot[i];
}
}
}
int sleep = 0;
rep1(i,1,n)
if (a[i][cur[i]]==2)
sleep++;
if (sleep>0) cout<<-1<<endl;
}
return 0;
}