题解 P4896 【OIer们的烦恼】

· · 题解

其实这道题真的很水

不信的话你们看:

有N条消息。 先输入N,第2行输入3个老(shen)师(ben)的名字,第3行输入5个学(ju)生(ruo)的名字,第4-N+3行输入N条消息。

那么小的数据范围,才3个老师与5个学生,光是暴力都能过啦

比较完全相同字符串也很简单,这样就可以了:

if (a+b==c) /*do something*/

然后就一遍过了

代码如下:

#include <bits/stdc++.h>
using namespace std;

/*
string a[5]用来存储老师的名字
string b[10]用来存储学生的名字
string ans[10]用来存储被抓到学生的名字 
bool k1用来记录现在有没有老师在 
bool c[10]用来记录哪个老师来了 
bool p[10]用来记录哪个学生在玩游(fu)戏(bai)
int size用来记录被抓到的学生有多少人 
*/

int n,size;
bool k1,c[10],p[10],vis[10];
string a[5],b[10],t,ans[10];

int main()
  {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    cin>>a[1]>>a[2]>>a[3];
    cin>>b[1]>>b[2]>>b[3]>>b[4]>>b[5];
    getline(cin,t);
    while (n--)
      {
        k1=false;
        getline(cin,t);
        for (int i=1;i<=3;i++) if (a[i]+" came!"==t)
          {
            c[i]=true;
            break;
          }
        for (int i=1;i<=3;i++) if (a[i]+" left!"==t)
          {
            c[i]=false;
            break;
          }
        for (int i=1;i<=5;i++) if (b[i]+" started playing games!"==t)
          {
            p[i]=true;
            break;
          }
        for (int i=1;i<=5;i++) if (b[i]+" stopped playing games!"==t)
          {
            p[i]=false;
            break;
          }
        for (int i=1;i<=3;i++) if (c[i]) k1=true;
        for (int i=1;i<=5;i++) if (k1&&p[i]&&!vis[i])
          {
            vis[i]=true;
            ans[++size]=b[i];
          }
      }
    sort(ans+1,ans+1+size); //排序
    for (int i=1;i<=size;i++) cout<<ans[i]<<" ";
    //特判集体腐败与无人腐败现象
    if (size==0) cout<<"How Good Oiers Are!";
    if (size==5) cout<<"\nHow Bad Oiers Are!";
    return 0;
  }

突然感觉我的跑得很慢,居然987ms

反正能过就行

算了反正蒟蒻就应该写蒟蒻的代码,要有蒟蒻的亚子