UVA - 12108 Extraordinarily Tired Students(特别困的学生)

来源:互联网 发布:数据库中修改表 编辑:程序博客网 时间:2024/06/02 16:42

题目链接UVA - 12108

题目思路:

用f[i]来纪录每个学生当前的状态(是否睡觉)
用now[i]来纪录每个学生处于当前状态的总时间
用first[i]来纪录所有学生最初时处于第几分钟,用于循环中判断是否无解(若后面重复到此状态即为无解)
特殊点:
学生a在第i分钟准备睡觉,对于是否进行睡觉的判断是由第 i - 1分钟得出的。

代码:

#include <stdio.h>#include <iostream>#include <vector>#include <math.h>#include <algorithm>#include <queue>#include <string.h>#include <set>#include <stack>#include <stdlib.h>#include <time.h>using namespace std;int va[11];//清醒周期长度int vb[11];//睡觉周期长度int now[11];//处于当前状态第几分钟int first[11];//最初处于第几分钟int f[11];//是否睡觉bool isall(int n)//判断是否与最初状态重合,即判断是否无解{    for(int i=0;i<n;i++)    {        int t = 0;        if(f[i])            t = va[i];//加上清醒周期的长度,与最初值保持一致        if(now[i] + t != first[i])            return false;    }    return true;}int main(){    int n, T=0;    while(cin>>n && n)    {        ++T;        int time = 1;//当前时间        int num = 0;//睡觉总人数        for(int i=0;i<n;i++)        {            cin>>va[i]>>vb[i]>>now[i];            first[i] = now[i];            if(now[i] > va[i])            {                f[i] = 1;                ++num;                now[i] -= va[i];            }            else                f[i] = 0;        }        while(1)        {            if(num == 0)//全部清醒,退出循环                break;            int t = 0;//本分钟睡觉人数的增减量            for(int i=0;i<n;i++)            {                ++now[i];                if(f[i])//睡                {                    if(now[i] > vb[i])                    {//开始清醒                        now[i] = 1;                        f[i] = 0;                        --t;                    }                }                else                {                    if(now[i] > va[i])                    {                        now[i] = 1;                        if(num*2 > n)//上一分钟睡觉人数是否符合睡觉条件                        {                            f[i] = 1;                            ++t;                        }                    }                }            }            num += t;            if(isall(n))            {                time = -1;                break;            }            ++time;        }        printf("Case %d: %d\n", T, time);    }    return 0;}
0 0
原创粉丝点击