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