author:&Carlton
tags:NOIP,枚举,数学
topic:【NOIP】入门题题解— —不高兴的津津、级数求和
language:C++
website:能力提升综合题单Part1 入门阶段 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
date:2023年7月12日
不高兴的津津
我的做题思路
比较简单,是一道枚举题(我还没懂枚举题的特点!但是看到这个标签了),核心算法是if判断,数据的更新迭代,即何时更新津津最不开心的日期day,以及如何记录、更新不开心程度hour_before。
丢人现场(Compile Error)
①在cout<<day<<endl 处忘记<<endl 输出这个特殊值了(可能不影响编译通过,但应养成良好习惯)
②定义hour,hour_before和day时没有分开写,写作hour=hour_before=day=0;编译器不认识还未定义好的hour_before和day
👇这是本题我的源代码
#include <iostream>
using namespace std;
int main()
{
int i,school[7],mother[7];
int n=0,hour=0,hour_before=0,day=0;
for(i=0;i<7;i++)
{
cin>>school[i]>>mother[i];
}
for(i=0;i<7;i++)
{
hour=school[i]+mother[i];
//不开心情况
if(hour>8)
{
n++;
//如果是这周第一次不开心
if(n==1)
{
day=i+1; //标记星期几
hour_before=hour; //记录这次不开心的程度
}
//如果比上一次不开心还要不开心
if(hour>hour_before)
{
day=i+1; //标记星期几
hour_before=hour; //记录这次不开心的程度
}
}
}
cout<<day<<endl;
return 0;
}
他山之石
有一个优化,一个思路
优化
不需要把第一次不高兴和再次不高兴的情况分得太开,即可以用一条if语句,条件判断表达式处理两种情况是否更新day值
题目核心的要求即为记录既大于8小时又比之前都不高兴的日期即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; //作为新手的我会的都写上
int main ()
{
int a,b,s,max=0,i,day=0; //a,b是我们津津(以下简称JJ)每天上课时间,s意为sum是上课时间之和
for (i=1;i<8;i++) // i为循环变量,day是JJ一周最不高兴的一天
{
cin>>a>>b; //输入a,b
s=a+b; //计算一天的上课时间
if ((s>max)&&(s>8)) max=s,day=i; //在超过8小时且比之前几天都大的s时,将s赋给最大值,并记录下JJ的这天
}
cout<<day; //由于day初值是0,所以如果JJ一周都开心就输出0
return 0;
}
思路
不用锁死“8”这个初始要求,基于上述题目核心要求分析,我们完全可以将目前为止最不高兴的程度作为比“8”更高要求的条件,直接用一个变量maxf做衡量的标准。
//对于下面的源代码,楼主的说法是不需要循环可以降低复杂度?但比较有用的还是上面的提炼。
#include <iostream>
using namespace std;
int main()
{
int t1,t2;
int maxf=8;
int t=0; //最大量,最大的天数
int now=0;//记录现在是哪天
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cin>>t1>>t2;
now++;
if(t1+t2>maxf) maxf=t1+t2,t=now;
cout<<t;
return 0;
}
级数求和
这个确实简单,标签是数学,注意数据类型、正确表示数字就可以了。
👇源代码
#include <iostream>
using namespace std;
int main()
{
int k;
double s=0,n=1.0;
cin>>k;
while(s<=k)
{
s+=1.0/n++; //先算后递增
}
cout<<(int)(n-1)<<endl; //退出前还是递增了,现减回去
return 0;
}
题解里头有进一步的思路:
运用数学知识减小复杂度,通过我们数学计算直接得出结果。
欢迎指正与分享,谢谢!