特别困的学生
Adolfo_North · · 题解
特别困的学生
很水的模拟题。难点是如何判断不存在清醒的情况,我们可以把学生的周期存进字符串,利用查找函数,查找是否出现环,若出现环输出即可。
我们可以把核心代码分成两部分看:
- 统计清醒的学生个数,如果全部清醒退出循环,这段代码不是很难。
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; } - 用字符串记录学生状态,并利用
\text{find} 函数判重。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+" ";//一定要判完重之后在连接,还要加空格
如果不理解判重部分,请看样例输出拓展:
在Case 1中可以发现在所有学生清醒之前没有出现环,即相同的学生状态,所以输出
在Case 2中可以发现在时间
若不加判重,可以发现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;
}