题解 P4896 【Oier们的烦恼】

· · 题解

题目地址

前言

这道题虽然很水但耗费了我一个多小时去调试...可能是我太弱了吧..还有测试数据3是什么鬼

Solution

此题就是一道模拟题...只要按照题目的意思模拟即可。但这道题也有一些坑点,比如getline多出来的空格,或者是打名字时多出来的回车...在这里我用了一种特殊的方法,就是什么也不判断

详见代码。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define M 114514
string teacher[4],stu[6],s;
char s1[M],stop_play[110]={" stopped playing games!"};
char start_play[110]={" started playing games!"};
char come[110]={" came!"},l[110]={" left!"};//char字符在全局变量里定义为空格...所以如果gets有多出空格的话是不需要判断的
bool a[11],comes,play[11];
int len,n;
int main()
{
    cin>>n;
    for(int i=1;i<=3;++i)
        cin>>teacher[i];
    for(int i=1;i<=5;++i)
        cin>>stu[i];
    sort(stu+1,stu+6); //题目中要求按字典序
    for(int i=1;i<=n;++i)
    {
        cin>>s; //cin以空格为结束符号 所以可以用来判断此题中的学生名字或老师名字,并且也可以避免
        gets(s1); //gets以回车作为结束符号
        for(int j=1;j<=3;++j)
            if(s==teacher[j])
            {
                if(!strcmp(s1,come)) comes=1;//按题意模拟
                if(!strcmp(s1,l)) comes=0;
            }
        for(int j=1;j<=5;++j)
            if(s==stu[j])
            {
                if(!strcmp(s1,stop_play)) play[j]=0; //strcmp函数判断两字符串是否相同
                if(!strcmp(s1,start_play)) play[j]=1;
            }
        if(comes==1) //当老师在的时候判断学生们是否在打游戏
        {
            for(int j=1;j<=5;++j)
                if(play[j] && !a[j])
                {
                    ++len;
                    a[j]=1; //标记一下...
                }
        }
        if(len==5) break;
    }
    for(int i=1;i<=5;++i)
        if(a[i]==1)
            cout<<stu[i]<<" ";
    if(len==0) cout<<"How Good Oiers Are!";
    if(len==5) cout<<endl<<"How Bad Oiers Are!";
    return 0;
}

据大佬们说此题还可以用string.erase来解决...不过我太弱不会