把阈值 8 当作最大值初值,一次扫描同时完成「是否不高兴」与「取最靠前的最大值」:只有严格大于才更新下标,并列和历史最长自然保留。
OJ: roj
题目 ID: 1111
难度:入门
标签:入门模拟循环python
创建: 2026-09-29 19:26
更新: 2026-10-05 02:16
题目描述
津津除了上学还要上课外班,如果某天上课总时间超过 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;
}