算法竞赛入门经典(第2版)习题4-8 特别困的学生UVa12108

来源:互联网 发布:二战德国火箭炮数据 编辑:程序博客网 时间:2024/06/10 05:00

输入学生个数、醒A分钟、睡B分钟和现在状态,输出第几分钟全部醒

做题体会:
        题目不难,不过需要集中精神思考,处理好数组里的数,不要出现逻辑错误;当现在状态等于初始状态时,表示进入死循环,不存在全部醒的时候



begin数组里,第1列表示状态A,第2列表示状态B,第3列表示初始状态,第4列表示现在状态,数组sleep为1时表示睡,为0时表示醒;yn=1时可以进入睡眠状态;




#include <stdio.h>int n, begin[12][5], sleep[12];int yn;  // if睡>醒 进入 睡,else 继续醒void check(int numstu){if(begin[numstu][3] > (begin[numstu][0]+begin[numstu][1]))begin[numstu][3] = begin[numstu][3] - (begin[numstu][0] + begin[numstu][1]);if(begin[numstu][3] == begin[numstu][0]+1 && yn)    //  yn=1 时可以睡sleep[numstu] = 1;else if(begin[numstu][3] == begin[numstu][0]+1 && yn == 0){sleep[numstu] = 0;begin[numstu][3] = 1;}else if(begin[numstu][3] < begin[numstu][0]+1)sleep[numstu] = 0;else if(begin[numstu][3] > begin[numstu][0]+1)sleep[numstu] = 1;}     //是否睡,赋值给sleep数组void yesno(){int i, sleepnum = 0;for(i = 1; i <= n; i++)if(sleep[i] == 1)sleepnum++;if(sleepnum > n-sleepnum)yn = 1;else yn = 0;}     //根据sleep数组判断是否可以睡觉int main(){while(scanf("%d", &n) && n){int i, ffvs = 1, nCase = 1, xing = 1;for(i = 1; i <= n; i++){scanf("%d%d%d", &begin[i][0], &begin[i][1], &begin[i][2]);}for(i = 1; i <= n; i++){for(;;){if(begin[i][2] > (begin[i][0]+begin[i][1]))begin[i][2] -= (begin[i][0]+begin[i][1]);else break;}if(begin[i][2] > begin[i][0])sleep[i] = 1;else sleep[i] = 0;}yesno();for(i = 1; i <= n; i++){begin[i][3] = begin[i][2];}for(i = 1; i <= n; i++){if(sleep[i] == 1)xing = 0;}  //是否全部醒if(xing){printf("Case %d: %d\n", nCase++, ffvs);ffvs = 0;}for(;ffvs >= 1;){int dgyu = 1, xing = 1;ffvs++;for(i = 1; i <= n; i++){begin[i][3]++;check(i);}     //更新完sleep数组for(i = 1; i <= n; i++){if(begin[i][2] != begin[i][3])dgyu = 0;}if(dgyu){printf("Case %d: -1\n", nCase++);   // 不存在全部清醒break;}for(i = 1; i <= n; i++){if(sleep[i] == 1)xing = 0;}  //是否全部醒if(xing){printf("Case %d: %d\n", nCase++, ffvs);break;}yesno();}}return 0;}


0 0
原创粉丝点击