UVA

/*
  有效使用结构体,会很简单,否则很难想
  
  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;
}


原文地址:https://www.cnblogs.com/mofushaohua/p/7789472.html