特别困的学生

· · 题解

特别困的学生

很水的模拟题。难点是如何判断不存在清醒的情况,我们可以把学生的周期存进字符串,利用查找函数,查找是否出现环,若出现环输出即可。

我们可以把核心代码分成两部分看:

如果不理解判重部分,请看样例输出拓展:

在Case 1中可以发现在所有学生清醒之前没有出现环,即相同的学生状态,所以输出 18。

在Case 2中可以发现在时间 4 的学生状态与时间 1 相同,所以输出 -1。

若不加判重,可以发现Case 2中的学生状态有规律的重复。

代码来喽。

#include<iostream>
using namespace std;
int a[11],b[11],c[11];
int main()
{
    string s;
    int n,Case,min=0;
    while(cin>>n&&n){
        min=0;
        s="";//有多组数据,初始化很重要。
        for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
        while(1){
            string ss="";
            min++;//计算分钟。
            int cnt=0;
            for(int i=1;i<=n;i++) if(c[i]<=a[i]) cnt++;//统计是否清醒。
            if(cnt==n){
                cout<<"Case "<<++Case<<": "<<min<<endl;
                break;
            }
            for(int i=1;i<=n;i++){
                if(c[i]==a[i]+b[i]||(c[i]==a[i]&&2*cnt>=n)) c[i]=0;//if(该醒醒了||(想睡但是好像不能睡))。
                c[i]++;
                ss=ss+char(c[i]+'0');//记录学生状态。
            }
            int sss=s.find(ss);
            if(sss>=0){
                cout<<"Case "<<++Case<<": "<<-1<<endl;
                break;
            }
            s=s+ss+" ";//若未出现环,添加一组学生状态。
        }

    } 
    return 0;
}