记录连续上升数字的个数[洛谷P1567 统计天数]

QUESTION:

题目描述

炎热的夏日,KC 非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。

经历千辛万苦,他收集了连续N(1≤N≤10^6) 天的最高气温数据。

现在,他想知道最高气温一直上升的最长连续天数。

输入格式

第 1 行:一个整数N 。1≤N≤10^6

第 2 行:N个空格隔开的整数,表示连续N 天的最高气温。0≤最高气温≤109 。

输出格式

1 行:一个整数,表示最高气温一直上升的最长连续天数。

输入输出样例

输入

10
1 2 3 2 4 5 6 8 5 9

输出

5

ANALYSIS AND ANSWER:

把实际问题具象化成对数字等数据的处理永远是找到解题思路的关键。连续多天的气温说白了就是一串数字,即题目要求我们在给定的一串未知个数的数字中找出连续上升个数最多的其中一串数字并输出其个数。这将会涉及到如何记录并清零上升天数、如何更新上升天数数据等问题。

捋清思路,在代码中,我们首先要想办法在遍历整个数组的同时用初始化为1的计数器num记录上升天数,即如果正在遍历的元素比上一个元素大则计数器加一,否则将计数器回归为1;

 int num = 1;//计数器初始化为1是因为我们默认在只有一个数字的时候上升天数直接为1
    //创建for循环来遍历数组
    for (int i = 1; i < N; i++) {
        if (tem[i] > tem[i - 1]) {
            num++;
        } else{
            num = 1;//如果元素不上升则计数器回归为1
         }
    }
​

()那么第一个元素又如何与上一个元素比较?其实将i初始化为1意味着从数组的第一位 即这串数字的第二个开始比较 解决了上述问题(反过来将i初始化为0 让i在0N-1的范围内与下一个元素比大小也可)

同时,我们需要再定义一个整数maxnum来储存我们所记录到的最大的连续上升天数(它的初始化可1可0真是个乖宝宝),也就是我们要输出的值。如果当前元素上升停止(即当前个元素比上一个元素小),我们把当前num的值与maxnum作比较,若num较大则更新maxnum的值。执行这个操作的条件刚好相反于累计计数器的条件,所以我们把这步操作放在for循环中的else括号内:

  int maxnum = 0;
    int num = 1;
​
    for (int i = 1; i < N; i++) {
        if (tem[i] > tem[i - 1]) {
            num++;
        } else {
            if (num > maxnum) {//如果累计记录创新高则更新输出值
                maxnum = num;
            }
            num = 1;//要在计数器回归初始值之前执行判断操作
        }
    }

至此,我们记录最高上升天数的主体已经呈现。但是我们会发现,如果最高上升天数中的最后一个数字处于末尾,那么这个for循环记录完后便不会执行else操作、更新输出值,而是跳出循环直接输出第二高的值。那么我们便需要在末尾放一个检查操作,检查最后未更新的num值是否大于maxnum:

   if (num > maxnum) {
        maxnum = num;//若未更新的值大于当前输出值则更新输出值
    }
​

大功告成。最后别忘了输入输出和回归函数值。

上答案

#include 
int main() {
    int N;
    scanf("%d", &N);
​
    int tem[N];
    for (int i = 0; i < N; i++) {//输入N天的气温值
        scanf("%d", &tem[i]);
    }
​
    int maxnum = 0;
    int num = 1;
​
    for (int i = 1; i < N; i++) {
        if (tem[i] > tem[i - 1]) {
            num++;//记录上升天数
        } else {
            if (num > maxnum) {
                maxnum = num;//更新最高上升天数
            }
            num = 1;
        }
    }
​
​
    if (num > maxnum) {
        maxnum = num;
    }//检查最后一组上升天数
​
    printf("%d\n", maxnum);
    return 0;
}

拆成一个一个小问题分别去处理果然非常简单。我当时为什么没想出来。。肯能是因为被求最高气温一直上升的最长连续天数这一串字给唬到了吧。。做题少 没有经验 没有意识 就不知道如何编写、用什么编写程序来处理问题。所以还是要多练啊

 

你可能感兴趣的:(开发语言,android,c语言,算法)