这道题目的难点主要在如何判断进入了循环,已经如何判断下一次的状态,总体来说还是比较容易的。
函数中的is_sleep()函数成功的解决了很多的问题,非常的好用。
下面贴上代码
//主要难点在于如何判断一直没有全醒的状态,保存各个状态,如果之前出现过这个状态,那么就一定会重复下去 //根据当前状态判断下一次的状态问题 #include<vector> #include<cstdio> using namespace std; vector<int>state[10];//保存状态 int awaken[10],sleep[10]; int num_student; void clear_vec() { for(int i=0;i<10;i++) { state[i].clear(); } } bool initial() { clear_vec(); scanf("%d",&num_student); if(!num_student) return false; //printf("num_student=%d\n",num_student); for(int i=0;i<num_student;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); //printf("%d %d %d \n",a,b,c); awaken[i]=a; sleep[i]=a+b; state[i].push_back(c); } return true; } bool is_sleep(int student,int num_state) { if(state[student][num_state]>awaken[student]) { return true; } return false; } int next(int student,int num_state)//student是学生代号,num_state是第几个状态 { if(sleep[student]==state[student][num_state]) { return 1;//睡觉的最后一个时刻,下一个时刻该醒了 } if(state[student][num_state]>awaken[student]) {//睡觉中间状态 return state[student][num_state]+1;//还是睡觉状态 } if(state[student][num_state]<awaken[student]) { //清醒的状态 return state[student][num_state]+1; } if(state[student][num_state]==awaken[student]) { //想要睡觉的状态,需要判断睡觉的人数,睡觉的人多于清醒的人,那么就睡觉 int cnt_sleep=0,cnt_awake=0; for(int i=0;i<num_student;i++) { if(is_sleep(i,num_state)) { cnt_sleep++; } else { cnt_awake++; } } if(cnt_sleep>cnt_awake) { //可以睡觉 return state[student][num_state]+1; } else { return 1;//继续醒着 } } } bool is_cycle(int num_state) { for(int j=0;j<num_state;j++) { int flag=1; for(int i=0;i<num_student;i++) { if(state[i][j]!=state[i][num_state]) { flag=0; break; } } if(flag) { return true; } } return false; } int begin() { for(int j=0;;j++) { int all_awaken=1; for(int i=0;i<num_student;i++) { if(is_sleep(i,j)) { all_awaken=0; break; } } if(all_awaken) { return j+1; } if(is_cycle(j)) { return 0; } for(int i=0;i<num_student;i++) { int x=next(i,j);//第i个学生的第j+1个状态 state[i].push_back(x); ////printf("%d ",is_sleep(i,j+1)); } //printf("\n\n"); } } int main() { int kase=0; #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif while(initial()) { int x=begin(); if(x) { printf("Case %d: %d\n",++kase,x); } else { printf("Case %d: -1\n",++kase); } } return 0; }