admin管理员组

文章数量:1530029

简单粗暴地判断不存在“全部都清醒的状态”

// uva12108.cpp
#include <stdio.h>
#include <string.h>
#define MAXN 12
// 1 for awaken state of students, 0 for sleep
struct student {
    int a;
    int b;
    int c; // c for state
} students[MAXN];
bool AllAwaken(int n){ 
    for (int stu = 0; stu < n; stu++)
        if (students[stu].c > students[stu].a - 1) return false;
    return true;
}
bool sleep_more_than_awaken(int n){
    int awaken = 0, sleep = 0;
    for (int stu = 0; stu < n; stu++)
        if (students[stu].c <= students[stu].a - 1) awaken++;
        else sleep++;
    return sleep > awaken;
}
void sleep(int n){     // the sleeping students is more than awakening, all go to next state
    for (int stu = 0; stu < n; stu++)
        students[stu].c = (students[stu].c + 1) % (students[stu].a + students[stu].b);
}
void awaken(int n){
    for (int stu = 0; stu < n; stu++)
        if (students[stu].c == students[stu].a - 1) students[stu].c = 0;
        else students[stu].c = (students[stu].c + 1) % (students[stu].a + students[stu].b);
}

int main(){
    int n, kase = 0;
    while (scanf("%d", &n) != EOF && n != 0){
        for (int stu = 0; stu < n; stu++) {
            scanf("%d%d%d", &students[stu].a, &students[stu].b, &students[stu].c);
            students[stu].c --;  // start from 0
        }
        int t = 1;
        bool exist = true;
        while ( !AllAwaken(n) ){
            // debug 
            // for (int stu = 0; stu < n ; stu ++){ 
            //      printf("%d " , students[stu].c);
            // }
            // for(int stu = n - 1; stu >= 0; stu--){
            //  if (students[stu].c > students[stu].a - 1) printf("*");
            //  else printf(" ");
            // }
            // printf("\n"); 
            if (sleep_more_than_awaken(n)) sleep(n);
            else awaken(n);
            t++;
            if ( t > 100000) { exist = false; break;}
        }
        printf("Case %d: %d\n", ++kase, exist ? t : -1);
    }
    return 0;
}

本文标签: 学生ExtraordinaryStudentsTired