题解:洛谷 P1085 不高兴的津津
【题目来源】
洛谷:P1085 [NOIP 2004 普及组] 不高兴的津津 - 洛谷(luogu.com.cn)
【题目描述】
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
【输入】
输入包括 \(7\) 行数据,分别表示周一到周日的日程安排。每行包括两个小于 \(10\) 的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
【输出】
一个数字。如果不会不高兴则输出 \(0\),如果会则输出最不高兴的是周几(用 \(1,2,3,4,5,6,7\) 分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
【输入样例】
5 3
6 2
7 2
5 3
5 4
0 4
0 6
【输出样例】
3
【核心思想】
-
问题分析:给定津津一周7天的日程安排,每天包括学校上课时间 \(a\) 和课外班时间 \(b\)。若某天总时间 \(a+b > 8\) 则津津不高兴,且上得越久越不高兴。求最不高兴的是周几(总时间最大且最先出现),若不会不高兴则输出0。
-
算法选择:
- 线性扫描:遍历7天,每天计算总时间,维护当前最大总时间和对应的日期
-
关键步骤:
- 初始化:
max = 0, ans = 0 - 遍历7天(\(i\) 从1到7):
- 读入
a, b - 若
a + b > 8(不高兴):- 若
a + b > max(比之前更不高兴):max = a + b, ans = i
- 若
- 读入
- 输出结果:
ans(若从未超过8小时则保持为0)
- 初始化:
-
时间/空间复杂度:
- 时间复杂度:\(O(7) = O(1)\),固定7次循环
- 空间复杂度:\(O(1)\),仅需常数个变量
-
线性扫描的核心思想:
- 贪心更新:遇到更大的不高兴程度立即更新答案,保证"最靠前"的约束(相同值时不会更新,保留先出现的)
- 阈值判断:先判断是否超过8小时,再比较最大值,减少不必要的比较
- 默认输出0:初始化
ans = 0,若7天均不超过8小时则自然输出0 - 适用于最值查找、条件筛选、周计划模拟类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件
using namespace std;
int main()
{
int a, b, max = 0, ans = 0; // a:上课时间,b:课外时间,max:最大总时间,ans:最不高兴的日期
// 遍历一周7天
for (int i = 1; i <= 7; i++) {
cin >> a >> b; // 输入当天的上课时间和课外时间
// 检查当天总时间是否超过8小时
if (a + b > 8) {
// 如果比之前记录的最大值更大,更新最大值和日期
if (a + b > max) {
max = a + b; // 更新最大总时间
ans = i; // 记录当前日期
}
}
}
// 输出最不高兴的日期(如果没有超过8小时的则输出0)
cout << ans;
return 0;
}
【运行结果】
5 3
6 2
7 2
5 3
5 4
0 4
0 6
3
浙公网安备 33010602011771号