C語言程序設計100例之(34):最長連號


例34   最長連號

題目描述

輸入n個正整數,(1<=n<=10000),要求輸出最長的連號的長度。(連號指從小到大連續自然數)

輸入格式

第一行,一個數n;

第二行,n個正整數,之間用空格隔開。

輸出格式

一個數,最長連號的個數。

輸入樣例

10

3 5 6 2 3 4 5 6 8 9

輸出樣例

5

        (1)編程思路。

        依次讀入n個數,每讀入下一個數x1,總與前一個數x0進行比較,若x1==x0+1,是連號,連號個數cnt++;若x1!=x0+1,不是連號,若當前求得的cnt最大,更新最長連號個數max,重新置cnt=1(x1作為新序列第1個數)。

        由於輸入的全部為正整數,因此,初始時可置前一個數x0=0,cnt=0。程序寫成一個簡單的循環。

        (2)源程序。

#include <stdio.h>

int main()

{

    int n,x0,x1,cnt,max;

    scanf("%d",&n);

    cnt=0,max=0,x0=0;

    while (n--)

    {

       scanf("%d",&x1);

       if (x1==x0+1)

          cnt++;

       else

        {

            if (cnt>max)  max=cnt;

            cnt=1;

        }

        x0=x1;

    }

    printf("%d\n",max);

       return 0;

}

習題34

34-1  統計天數

      本題選自洛谷題庫 (https://www.luogu.org/problem/P1567)

題目描述

炎熱的夏日,KC 非常的不爽。他寧可忍受北極的寒冷,也不願忍受廈門的夏天。最近,他開始研究天氣的變化。他希望用研究的結果預測未來的天氣。

經歷千辛萬苦,他收集了連續 N (1≤N≤106 ) 的最高氣溫數據。

現在,他想知道最高氣溫一直上升的最長連續天數。

輸入格式

第 1 行:一個整數 N 。1≤N≤106

第 2 行:N個空格隔開的整數,表示連續 N 天的最高氣溫。0≤ 最高氣溫≤109  。

輸出格式

1 行:一個整數,表示最高氣溫一直上升的最長連續天數。

輸入樣例

10

1 2 3 2 4 5 6 8 5 9

輸出樣例

5

       (1)編程思路。

        同例34的解法。依次讀入n個數,每讀入下一個數x1,總與前一個數x0進行比較,若x1>x0,氣溫上升,連續上升天數cnt++;若x1<=x0,氣溫不是上升的,若當前求得的cnt最大,更新最長連續天數max,重新置cnt=1(x1作為新序列第1個溫度)。

        由於輸入的數據>=0,因此,初始時可置前一個數x0=0,cnt=0。程序寫成一個簡單的循環。

      (2)源程序。

#include <stdio.h>

int main()

{

    int n,x0,x1,cnt,max;

    scanf("%d",&n);

    cnt=0,max=0,x0=0;

    while (n--)

    {

       scanf("%d",&x1);

       if (x1>x0)

          cnt++;

       else

        {

            if (cnt>max)  max=cnt;

            cnt=1;

        }

        x0=x1;

    }

    printf("%d\n",max);

       return 0;

}

34-2  低窪地  

        本題選自洛谷題庫 (https://www.luogu.org/problem/P1317)

題目描述

一組數,分別表示地平線的高度變化。高度值為整數,相鄰高度用直線連接。找出並統計有多少個可能積水的低窪地?

 

如圖:地高變化為 0 1 0 2 1 2 0 0 2 0

輸入格式

兩行,第一行n,表示有n個數。第2行連續n個數表示地平線高度變化的數據,保證首尾為0。(3<=n<=10000,0<=高度<=1000)

輸出格式

一個數,可能積水低窪地的數目。

輸入樣例

10

0 1 0 2 1 2 0 0 2 0

輸出樣例

3

       (1)編程思路。

        由圖示可以看出,一個低窪地一定是左邊是下坡,右邊是上坡。設輸入的前后兩個數分別為pre和next,若next<pre,一定形成下坡,可置標志down=1;若next>pre,此時是上坡,若前面的下坡已形成(即down=1),則一定形成低窪地,cnt++,同時置down=0。

        用一個簡單的循環讀入N個數,讀入下一個數按上述辦法與前一個數比較並進行相應處理即可。

      (2)源程序。

#include<stdio.h>

int main()

{

    int n;

    scanf("%d",&n);

    int pre,next,ans=0,down=0;

    scanf("%d",&pre);

    for (int i=2;i<=n;i++)

    {

        scanf("%d",&next);

        if (next<pre) down=1;

        if (next>pre && down==1) { ans++;  down=0;}

        pre=next;

    }

    printf("%d\n",ans);

    return 0;

}

34-3  山路爬升

        本題選自洛谷題庫 (https://www.luogu.com.cn/problem/P6489)

題目描述

Tomislav 去爬山。他所走的山路可以看做一個長度為n 的數字序列 Pi,Pi表示位置i 的高度為Pi。

從低處往高處走一段連續的高度嚴格遞增的山路稱為一次爬升。

為了鍛煉身體,他想走一段落差盡量大的爬升。

一段山路的落差定義為這段山路的結束點與起始點的差。

你需要求出他走一段山路所能達到最大的落差是多少。

輸入格式

輸入第一行一個整數n,表示山路的長度。

第二行n 個整數Pi,表示位置 ii 的高度為Pi。

輸出格式

輸出一行一個整數,表示最大的落差。

如果整條山路不包含任何的爬升,則輸出 0。

輸入樣例 #1

5

1 2 1 4 6

輸出樣例 #1

5

輸入樣例 #2

8

12 20 1 3 4 4 11 1

輸出樣例 #2

8

輸入樣例 #3

6

10 8 8 6 4 3

輸出樣例 #3

0

      (1)編程思路。

        先讀入高度P1作為pre,記爬升高度sum和最大爬升高度ans均為0。之后依次讀入n-1個高度,每讀入下一個高度cur,總與前一個高度pre進行比較,若cur>pre,向上爬升,修改爬升高度sum=sum+(cur-pre),若修改后的sum>ans,置ans=sum;若cur<=pre,不是爬升,更新爬升高度sum=0。程序寫成一個簡單的循環。

     (2)源程序。

#include<stdio.h>

int main()

{

   int n;

   scanf("%d",&n);

   int ans=0;

   int pre,cur;

   scanf("%d",&pre);

   int sum=0;

   for (int i=2;i<=n;i++)

   {

       scanf("%d",&cur);

       if (cur>pre)

       {

           sum=sum+cur-pre;

           if (sum>ans) ans=sum;

       }

       else

          sum=0;

       pre=cur;

   }

   printf("%d\n",ans);

   return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM