该题目摘录自信息学奥赛一本通(C++版)在线评测系统,文章由CSDN - 专业开发者社区提供支持
【题目描述】
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
【输入】
包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
【输出】
包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
【输入样例】
5 3
6 2
7 2
5 3
5 4
0 4
0 6
【输出样例】
3
个人觉得通过率较高的一道题,有兴趣可以和我一起看看。
解题思路
可以先建立一个表示最大值的变量,将它初始值设置为8(>8为不高兴,不需要考虑<8的情况),以便循环结束后判断如果最大值仍是8,那么说明她没有不高兴的日子。然后开始循环,因为我们不知道循环的次数,所以每次循环输入a和b(分别表示学校上课时间和课外班时间),判断它们的总和是否大于最大值,如果是将最大值改为a+b,但是注意题目要求返回的并不是最大值,而是最大值对应的星期几,这里我们将最大值对应日期的变量设置为循环变量i。最后判断如果最大值为8输出0,否则输出最大值对应日期的变量。
或者将数据输入到数组,再依次判断数组内容,但这样做比较麻烦,各位同学下去可以试一试,我们期末揭晓大会(8月20日及以后搜索“北辰萤火_璎珞期末答案揭晓“)公布答案。
正解代码
// ybt.ssoier.cn 1111
#include<bits/stdc++.h>
using namespace std;
int main(){
int max=8,a,b,x;
for(int i=1;i<=7;i++){
cin>>a>>b;
if(a+b>max){
max=a+b;
x=i;
}
}
if(max==8) cout<<0;
else cout<<x;
return 0;
}
重点解析
第6 Ⅵ行 max:最大值,默认为8 a:循环中学校上课时长 b:循环中课外上课时长 x:最不高兴的日期
第9 Ⅸ行 判断a+b是否大于max,也就是是否有新的最大值出现。
第10 Ⅹ行 将max设置为a+b,说一下这个数据max虽然不用输出,但是其作为一个参考值,用于判断max是否等于8,以决定津津是否一周没有不高兴的日子。
第11 ⅩⅠ行 如果满足条件,将x临时设为i,也就是当前轮到的这一天。最后输出的时候不可以使用i,因为循环结束,其循环变量自动被释放。
第14 ⅩⅣ行 如果max=8,那么一周都很高兴,输出0。
第15 ⅩⅤ行 否则,输出最不高兴的那天(x)。
这道题考什么
这道题出现在04年NOIP普及组,个人认为其类型是那种骗人题,就是给你讲一大堆废话,其实没多难,需要抓住关键词,理解题目真正的意思,再选择方法解题。考点在于最大值提取的方法(初始值,如何判断切换),循环的熟练程度(循环输入,循环变量的应用),判断语句应用(判断新值和最大值的大小,判断最终最大值)。这17行代码复习时可以简单熟悉一下,过一遍语法,没准运气好考试真有这种题呢。
有什么问题或解法发在评论区,今天就不发投票了。麻烦点个赞,关注收藏,谢谢。