資訊學奧賽一本通(C++版)第一部分 C++語言 第五章 陣列
第五章 陣列
第一節 一維陣列
T1102 : 與指定數字相同的數的個數
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
輸出一個整數序列中與指定數字相同的數的個數。
【輸入】
輸入包含三行:
第一行為,表示整數序列的長度;
第二行為個整數,整數之間以一個空格分開;
第三行包含一個整數,為指定的數字。
【輸出】
輸出為個數中與相同的數的個數。
【輸入樣例】
3
2 3 2
2
【輸出樣例】
2
【答案&程式碼】
#include<cstdio>
int n,num[ 101],m;
int main(void){
register int i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&num[i]);
scanf("%d",&m);
for(i=1;i<=n;++i)
if(num[i]==m)
++sum;
printf("%d\n",sum);
return 0;
}
T1103 : 陶陶摘蘋果
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
陶陶家的院子裡有一棵蘋果樹,每到秋天樹上就會結出個蘋果。蘋果成熟的時候,陶陶就會跑去摘蘋果。陶陶有個釐米高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。
現在已知個蘋果到地面的高度,以及陶陶把手伸直的時候能夠達到的最大高度,請幫陶陶算一下她能夠摘到的蘋果的數目。假設她碰到蘋果,蘋果就會掉下來。
【輸入】
包括兩行資料。第一行包含個到之間(包括和)的整數(單位:釐米)分別表示個蘋果到地面的高度,兩個相鄰的整數之間用一個空格隔開。第二行只包括一個到之間(包括和)的整數(單位:釐米),表示陶陶把手伸直的時候能夠達到的最大高度。
【輸出】
包括一行,這一行只包含一個整數,表示陶陶能夠摘到的蘋果的數目。
【輸入樣例】
100 200 150 140 129 134 167 198 200 111
110
【輸出樣例】
5
【答案&程式碼】
#include<cstdio>
int n,tall[11];
int main(void){
register int i,sum=0;
for(i=1;i<=10;++i)
scanf("%d",&tall[i]);
scanf("%d",&n);
for(i=1;i<=10;++i)
if(tall[i]<=n+30)
++sum;
printf("%d\n",sum);
return 0;
}
T1104 : 計算書費
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
下面是一個圖書的單價表:
計算概論元/本
資料結構與演算法元/本
數字邏輯元/本
C++
程式設計教程元/本
人工智慧元/本
計算機體系結構元/本
編譯原理元/本
作業系統元/本
計算機網路元/本
JAVA
程式設計元/本
給定每種圖書購買的數量,程式設計計算應付的總費用。
【輸入】
輸入一行,包含個整數,分別表示購買的《計算概論》、《資料結構與演算法》、《數字邏輯》、《C++程式設計教程》、《人工智慧》、《計算機體系結構》、《編譯原理》、《作業系統》、《計算機網路》、《JAVA程式設計》
的數量(以本為單位)。每兩個整數用一個空格分開。
【輸出】
輸出一行,包含一個浮點數,表示應付的總費用。精確到小數點後一位。
【輸入樣例】
1 5 8 10 5 1 1 2 3 4
【輸出樣例】
2140.2
【答案&程式碼】
#include<cstdio>
int b[10];
int main(void){
register int i;
for(i=0;i<10;++i)
scanf("%d",&b[i]);
float s=(b[0]*28.9)+(b[1]*32.7)+(b[2]*45.6)+(b[3]*78)+(b[4]*35)+(b[5]*86.2)+(b[6]*27.8)+(b[7]*43)+(b[8]*56)+(b[9]*65);
printf("%.1f\n",s);
return 0;
}
T1105 : 陣列逆序重存放
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
將一個數組中的值按逆序重新存放。例如,原來的順序為。要求改為。
【輸入】
輸入為兩行:第一行陣列中元素的個數,第二行是個整數,每兩個整數之間用空格分隔。
【輸出】
輸出為一行:輸出逆序後陣列的整數,每兩個整數之間用空格分隔。
【輸入樣例】
5
8 6 5 4 1
【輸出樣例】
1 4 5 6 8
【答案&程式碼】
#include<cstdio>
#include<cmath>
int n,num[101];
int main(void){
register int i;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&num[i]);
for(i=n;i>=1;--i)
printf("%d ",num[i]);
putchar('\n');
return 0;
}
T1106 : 年齡與疾病
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
某醫院想統計一下某項疾病的獲得與否與年齡是否有關,需要對以前的診斷記錄進行整理,按照以上(含)四個年齡段統計的患病人數佔總患病人數的比例。
【輸入】
共行,第一行為過往病人的數目,第二行為每個病人患病時的年齡。
【輸出】
按照以上(含)四個年齡段輸出該段患病人數佔總患病人數的比例,以百分比的形式輸出,精確到小數點後兩位。每個年齡段佔一行,共四行。
【輸入樣例】
10
1 11 21 31 41 51 61 71 81 91
【輸出樣例】
20.00%
20.00%
20.00%
40.00%
【答案&程式碼】
#include<cstdio>
#include<cmath>
int n,sum[4],temp;
int main(void){
register int i;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&temp);
if(temp<=18)
++sum[0];
else if(temp<=35)
++sum[1];
else if(temp<=60)
++sum[2];
else
++sum[3];
}
printf("%.2f%%\n%.2f%%\n%.2f%%\n%.2f%%\n",sum[0]*100.0/n,sum[1]*100.0/n,sum[2]*100.0/n,sum[3]*100.0/n);
return 0;
}
T1107 : 校門外的樹
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
某校大門外長度為的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是米。我們可以把馬路看成一個數軸,馬路的一端在數軸的位置,另一端在的位置;數軸上的每個整數點,即都種有一棵樹。
由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
【輸入】
第一行有兩個整數,代表馬路的長度,代表區域的數目,和之間用一個空格隔開。接下來的行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。
對於的資料,區域之間沒有重合的部分;對於其它的資料,區域之間有重合的情況。
【輸出】
包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。
【輸入樣例】
500 3
150 300
100 200
470 471
【輸出樣例】
298
【答案&程式碼】
#include<cstdio>
#include<cmath>
bool tr[10001];
int l,m,t1,t2;
int main(void){
register int i,j,sum=0;
scanf("%d%d",&l,&m);
for(i=1;i<=m;++i){
scanf("%d%d",&t1,&t2);
for(j=t1;j<=t2;++j)
tr[j]=true;
}
for(i=0;i<=l;++i)
if(!tr[i])
++sum;
printf("%d\n",sum);
return 0;
}
T1108 : 向量點積計算
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
線上性代數、計算幾何中,向量點積是一種十分重要的運算。給定兩個維向量,求點積。
【輸入】
第一行是一個整數;
第二行包含個整數;
第三行包含個整數