/*
有效使用结构体,会很简单,否则很难想
BTW,发现有个博主的写法,真是简单又易懂,他在struct中放了布置3个数据,并且还有个专门用来更新,当前时刻位于周期中哪个位置,的函数
总之是很不错的写法,于是按照他的思路,修改了自己的冗长代码,blog:
http://blog.csdn.net/shannonnansen/article/details/42708257
这题的WA点:
//刚开始写时,忘记了在重载输入的student变量前加引用,导致用重载输出输出的时候,发现输出的全都是0...看来基础的语法真是要时不时回顾一下,分明上学期才学过,居然忘了重载输入要加引用这么重要的知识点 T^T
*/
#include <iostream>
#include <cstdio>
using namespace std;
int n;
struct student
{
int a, b, c, period;
bool reinit(int d)
{
return (c == a && d >= n - d) || (c == period); //想睡觉但班级睡觉的人太少,进入下一个等待周期;或已经睡完b分钟起来,进入新一轮周期
}
} s[15];
const int MAX_TIME = 10000;
istream& operator >> (istream&in, student& t)
{
in >> t.a >> t.b >> t.c;
t.period = t.a + t.b;
return in;
}
ostream& operator << (ostream&out, const student& t)
{
out << t.a << " " << t.b << " " << t.c << endl;
return out;
}
int getAwake ();
int main()
{
cin.tie(0);
cin.sync_with_stdio(false);
int k = 0, i, j;
while (cin >> n && n)
{
k++;
for (i = 0; i < n; i++) cin >> s[i];
// for (i = 0; i < n; i++) cout << s[i];
for (i = 1; i < MAX_TIME; i++)
{
int count;
if ((count = getAwake()) == n) break;
for (j = 0; j < n; j++)
if (s[j].reinit(count)) s[j].c = 1;
else s[j].c++;
}
cout << "Case " << k << ": " << (i < MAX_TIME ? i : -1) << endl;
}
return 0;
}
int getAwake ()
{
int ans = 0;
for (int i = 0; i < n; i++)
if (s[i].c <= s[i].a) ans++;
return ans;
}