不高兴的津津

GitHub跳转原题关系图返回列表

把阈值 8 当作最大值初值,一次扫描同时完成「是否不高兴」与「取最靠前的最大值」:只有严格大于才更新下标,并列和历史最长自然保留。

OJ: roj

题目 ID: 1111

难度:入门

标签:入门模拟循环python

创建: 2026-09-29 19:26

更新: 2026-10-05 02:16

题目描述

津津除了上学还要上课外班,如果某天上课总时间超过 8 小时就会不高兴,上得越久越不高兴,不高兴不会持续到第二天。 输入:七行,第 ii 行两个小于 10 的非负整数,用空格隔开,分别表示第 ii 天(周一到周日)在学校上课的时间和妈妈安排的上课时间。输出:一行,若没有一天超过 8 小时输出 0;否则输出最不高兴的是周几(1~7 表示周一到周日);若两天不高兴程度相当,输出时间最靠前的一天。 样例输入(每行一个,共 7 行):5 3 6 2 7 2 5 3 5 4 0 4 0 6 样例输出:3

思路

把阈值 8 当作最大值初值,逐天读入两个数求和,只在总和严格大于当前最大值时更新最大值和天数编号。扫描结束后编号仍为 0 就输出 0;严格大于保证并列时保留最靠前的一天,且恰好等于 8 不算不高兴。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 19:26
# update_at: 2026-09-29 19:29

import sys

OVERLOAD_HOURS = 8  # 一天上课超过这个小时数就会不高兴


def solve() -> None:
    data = iter(map(int, sys.stdin.buffer.read().split()))

    # 输入一周七天、每天两个数:zip 同一个迭代器就是"每次取一对"
    totals = [school + extra for school, extra in zip(data, data)]

    day = 0                       # 0 表示这一周都不会不高兴
    longest = OVERLOAD_HOURS      # 只在这条线以上才算"不高兴"
    for d, total in enumerate(totals, 1):
        if total > longest:       # 严格大于:时长并列时不更新,保留时间更靠前的一天
            longest, day = total, d

    print(day)


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 02:16
 * update_at: 2026-10-05 02:16
 */

#include <cstdio>

// 一周最多 7 天,天数下标从 1 开始和题面(周一~周日)对应
const int MAXN = 10;

int school[MAXN]; // school[i] 表示第 i 天在学校上课的小时数
int extra[MAXN];  // extra[i]  表示第 i 天妈妈安排的课外班小时数

int main() {
    // 逐天读入,第 i 行是第 i 天(周一~周日)的两个时间
    for (int i = 1; i <= 7; ++i) {
        scanf("%d %d", &school[i], &extra[i]);
    }

    int longest = 8; // 把阈值 8 当作最大值初值:没被更新过就说明没有一天超过 8
    int day = 0;     // day = 0 表示不会不高兴,否则记录最不高兴的是周几

    for (int i = 1; i <= 7; ++i) {
        int total = school[i] + extra[i]; // 第 i 天的上课总时间
        // 只有严格大于才更新:并列时保留最靠前的一天,恰好等于 8 也不算不高兴
        if (total > longest) {
            longest = total;
            day = i;
        }
    }

    printf("%d\n", day);
    return 0;
}