【题解】洛谷P4896 OIer们的烦恼

题目链接P4896 OIer们的烦恼
PS: 考虑到洛谷上题目可以通过网页浏览,简便起见,这里仅附上题目链接,略去题目描述和样例。

题解

  比较直观的模拟题。按照题目要求一步步模拟就好了。为了克服一下自己的惰性,我决定接下来简单说一下思路和注意点。
  我们可以把一条消息看成一个“阶段”。当新的消息出现时,更新当前阶段老师(是否在巡视机房)和学生的状态(是否在打游戏)。此外,如果一个老师开始巡视机房,就把正在打游戏的学生加入答案集合;如果一个学生开始打游戏,且机房有老师时,也将其加入答案集合。答案集合的数据类型是set,自带去重,不用担心重复加入导致的错误问题。
  这个题目略微麻烦的一点是,输入中存在部分无效消息的干扰,对此,考虑到老师和学生的人数非常少,我们可以直接暴力生成所有的有效信息,存在哈希表中。将接收到的消息与哈希表中的比较即可确认信息的有效性。
  最后说一下注意点。cin输入 5 5 5 个学生的名字后,会遗留一个换行符'\n'在后面没有读取,在使用getline函数读取消息之前,应当额外预加一行getline把换行符“吃掉”,不然会出错。在实现代码中,对这个关键的语句会有注释。
  实现的代码如下:

#include 
#include 
#include  
#include 
#include 

using namespace std;

string name[8];

int main() {
	int N;
	cin >> N;
	
	unordered_map<string, int> teac, teal, stus, stue;
	for (int i = 0; i < 8; ++i) {
		cin >> name[i];
		if (i < 3) {
			teac[name[i] + " came!"] = i;
			teal[name[i] + " left!"] = i;
		} else {
			stus[name[i] + " started playing games!"] = i;
			stue[name[i] + " stopped playing games!"] = i;
		}
	}
	
	string info;
	set<string> curplayer, teacur, ans;
	
	// !!!这一步非常关键,用于吃掉前面 cin 遗留的换行符(否则会WA)
	getline(cin, info);		 
	
	for (int i = 0; i < N; ++i) {
		getline(cin, info);		 
		
		if (teac.count(info)) {
			// 老师进入机房
			teacur.insert(name[teac[info]]);
			for (auto& t : curplayer)
				ans.insert(t);
		} else if (teal.count(info)) {
			// 老师离开机房
			teacur.erase(name[teal[info]]);
		} else if (stus.count(info)) {
			// 学生开始打游戏
			curplayer.insert(name[stus[info]]);
			if (teacur.size() > 0) ans.insert(name[stus[info]]); 
		} else if (stue.count(info)) {
			// 学生停止打游戏
			curplayer.erase(name[stue[info]]);
		}
	}
	
	if (ans.size() == 0)
		cout << "How Good Oiers Are!\n";
	else {
		for (auto it = ans.begin(); it != ans.end(); )
			cout << *it << " \n"[++it == ans.end()];
		if (ans.size() == 5)
			cout << "How Bad Oiers Are!\n";
	}
	return 0;
}

总结

  很久之前就想着要花些时间多做做模拟题。前段时间收藏了一份模拟题单,其中不乏一些丧心病狂的大模拟题目。我想着,终究不能一直沉迷于做各种算法题,也得训练一下自己的代码实现和代码调试的能力,今天终于付诸实践,做了题单上的第一题,也是最简单的一题(瑟瑟发抖)。个人体验是思路简单,实现难度中等偏上,这或许更接近实际工程。切实提升自己的代码能力和工程能力,从算法竞赛、OJ平台走向实际,也是我做模拟题的初衷,这一块之前一直被忽视,现在也是时候提上日程,把它放到一个比较重要的位置了。

你可能感兴趣的:(算法,c++)