算法习题---4-8特别困的学生(UVa12108)

一:题目

课堂上有n个学生(n<=10),每个学生上课都会出现一个“清醒-睡眠”周期,其中第i个学生学习Ai分钟后睡眠Bi分钟,依次重复。其中在从清醒到睡眠时有一个条件:只有到全班睡眠人数大于清醒人数时,这个学生才敢睡觉。
题目使用(A,B,C)来描述一个学生的信息,A是该学生的清醒时间,B是该学生的睡眠时间,C是该学生的初始状态值(即在初始时是这个周期的第几分钟)
问经过多久,所有人都清醒,当然也可能不存在这个时间,就输出-1.

(一)案例详解

3       学生人数
2 4 1    清醒2分钟 睡眠4分钟 初始状态是在周期第1分钟
1 5 2    清醒1分钟 睡眠5分钟 初始状态是在周期第2分钟
1 4 3    清醒1分钟 睡眠4分钟 初始状态是在周期第3分钟

(一)样例输入

3       学生人数
2 4 1    清醒2分钟 睡眠4分钟 初始状态是在周期第1分钟
1 5 2    清醒1分钟 睡眠5分钟 初始状态是在周期第2分钟
1 4 3    清醒1分钟 睡眠4分钟 初始状态是在周期第3分钟
3
1 2 1
1 2 2
1 2 3
0

(二)样例输出

Case 1: 18
Case 2: -1

 二:代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string>

#define CLASSTIME 1000000    //设置课程时间最大

int sNum;    //学生人数1-10
int a[11], b[11], c[11];    //记录各个学生的初始信息

获取学生信息

int getStuInfo()
{
    scanf("%d", &sNum);
    if (!sNum)
        return 0;
    getchar();

    for (int i = 1; i <= sNum; i++)
    {
        scanf("%d %d %d", &a[i], &b[i], &c[i]);
        getchar();
    }

    return 1;
}

获取全部学生清醒的时刻(真正开始上课的时间)

int getRealStuTime()
{
    int count;
    for (int i = 1; i < CLASSTIME;i++)
    {
        count = 0;
        for (int j = 1; j <= sNum; j++) //先获取睡觉人数
            if (c[j] > a[j])    //在睡觉
                count++;
        if (count == 0)    //全部在学习
            return i;
        for (int j = 1; j <= sNum; j++)    //更新状态
        {
            if (c[j] == a[j] + b[j] || (c[j] == a[j] && count < sNum - count)) //一个周期 或者 如果睡觉人数少于学习人数,则不敢睡觉,开始重新学习
                c[j] = 0;
            c[j]++;    //更新每个学生的状态
        }
    }
    return -1;
}

主函数

void main()
{
    int n = 1;
    FILE* fp = freopen("data8.in", "r", stdin);
    freopen("data8.out", "w", stdout);

    while (getStuInfo())
        printf("Case %d: %d
", n++, getRealStuTime());

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}
原文地址:https://www.cnblogs.com/ssyfj/p/11167003.html