洛谷P1567统计天数 C++解法

洛谷P1567统计天数

在这里插入图片描述
先上我的失败代码:

#include<stdio.h>
#include <iostream>
#include <iomanip>
#include<cmath>
#include <algorithm>
using namespace std;


int main()
{
    int n;
    int temp[100001] = { 0 };
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> temp[i];
    }
    int cnt = 0;
    int times = 0;
    int daynum = 0;
    /*
    cnt:加到哪一位了
    times:递增几位了
    num[]:递增天数记录
    daynum:num数组的位标
    思路是利用逐个记录递增的天数再利用sort函数排列,之后求最大值。
	*/
    int num[100000] = { 0 };
    while (cnt<n) {
        for (int i = 0; ; i++)
        {
            if (temp[cnt+i] < temp[cnt + i+1]) {
                times++;
                continue;
            }
            else
            {
                if (i != 0)
                {
                    cnt = cnt + i;
                }
                else
                {
                    cnt = cnt + 1;
                }
                if (times == 0)
                {
                    num[daynum] = times;
                }
                else
                {
                    num[daynum] = times+1;
                }
                times = 0;
                daynum++;
                break;
            }
        }
    }
    sort(num, num + daynum);
    cout << num[daynum - 1];
}

不足之处
1.本题数据量大,10的6次方,在达到这个大数字的数据下,我定义的数组空间是不足以存储的,而在改正之后,程序出现异常,提示说栈空间不足…当然这也不能怪罪别人,主要还是由于我自己思路的局限性,没有考虑到可以使用实时更替的一个变量储存值来代替数组的存储、排序

2.对题目的思路还不够清楚,我这个思路必然不是最优解…(废话不然怎么会错) 导致代码太啰嗦了…
决定以后洛谷解题系列的文章都要挑一个高效且思路清晰的标准答案作为对比…

3.还是没有特意考虑数据刚好是边界值的情况,不够严谨。

好的地方:(我还是得夸自己)
1.在思考的时候,遇到想不清楚的地方知道在本子上好好列思路图和各个变量的作用来整理自己的思路

2.吸取了前几次编程的教训,计数变量有及时清零。

3.上学期期末复习发现的sort函数活学活用了!

标准解答

#include<stdio.h>
#include <iostream>
#include <iomanip>
#include<cmath>
#include <algorithm>

using namespace std;

int main(){
    int n,tem1=0,tem2=0,a=0,b=0;//分别是N,温度1,温度2,以及统计天数用的两个参量 
    cin>>n;
    for(int k=0;k<n;k++){
        cin>>tem2;
        if(tem2>tem1)
            a+=1;//若第二天(tem2)的温度大于前一天的温度(tem1),则天数加一 
        else{
            b=(a>b)?a:b;//否则,令b等于a,b中较大值 
            a=0;//并把a清空 
        }
        tem1=tem2;//对于第三天来说,第三天的温度是tem2,第二天的温度是tem1 
    }
    cout<<b+1;//本代码天数统计的起点是0,但题目是1,也可在初始赋值是将a=0改为a=1 
    return 0;
}
}

思路:
大佬的思路大致是这样的:
首先利用获得的数据总数建立for循环,不断获得接下来输入的数字,但是不把数字存在数组里,而是当下利用变量储存完、使用完,出循环之后在利用原来的变量容器来储存新的数据,从而达到了不开辟大数组,占用内存少的目的。

接下来对于获得的温度,与前一天的对比,大于则a++,小于则表明递增结束了,那么就与储存一直以来最大值的b进行比较。(同时这里利用的三目运算符一次性完成了取ab最大值的操作)

最后根据题目的性质输出b

收获总结:
1.对于这种,大规模数据求xx最大值的题目,不要急着建立大数组,可以考虑利用for循环,完成随到随处理。

2.求最大值可以建立两个变量,一个储存当下的每个值,另一个存目前为止的最大值,这样也避免了建立数组的麻烦和耗时

写在最后

我失去了一只臂膀
就睁开了一只眼睛
——顾城《杨树》

:)thanks for your reading

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值