【NOIP】入门题题解— —不高兴的津津、级数求和

16 篇文章 0 订阅
10 篇文章 0 订阅

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;
}

        题解里头有进一步的思路:

        运用数学知识减小复杂度,通过我们数学计算直接得出结果

 

欢迎指正与分享,谢谢!

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值