算法習題---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", n++, getRealStuTime());

    freopen("CON", "r", stdin);
    freopen("CON", "w", stdout);
}
相關文章
相關標籤/搜索