1. 程式人生 > >資訊學奧賽一本通(C++版)第一部分 C++語言 第五章 陣列

資訊學奧賽一本通(C++版)第一部分 C++語言 第五章 陣列

第五章 陣列

第一節 一維陣列

T1102 : 與指定數字相同的數的個數

時間限制: 1000 ms 記憶體限制: 65536 KB

【題目描述】

  輸出一個整數序列中與指定數字相同的數的個數。

【輸入】

  輸入包含三行:

  第一行為N(N100)N(N≤100),表示整數序列的長度;

  第二行為NN個整數,整數之間以一個空格分開;

  第三行包含一個整數,為指定的數字mm

【輸出】

  輸出為NN個數中與mm相同的數的個數。

【輸入樣例】

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

【題目描述】

  陶陶家的院子裡有一棵蘋果樹,每到秋天樹上就會結出1010個蘋果。蘋果成熟的時候,陶陶就會跑去摘蘋果。陶陶有個30

30釐米高的板凳,當她不能直接用手摘到蘋果的時候,就會踩到板凳上再試試。

  現在已知1010個蘋果到地面的高度,以及陶陶把手伸直的時候能夠達到的最大高度,請幫陶陶算一下她能夠摘到的蘋果的數目。假設她碰到蘋果,蘋果就會掉下來。

【輸入】

  包括兩行資料。第一行包含1010100100200200之間(包括100100200200)的整數(單位:釐米)分別表示1010個蘋果到地面的高度,兩個相鄰的整數之間用一個空格隔開。第二行只包括一個100100120120之間(包括100100120120)的整數(單位:釐米),表示陶陶把手伸直的時候能夠達到的最大高度。

【輸出】

  包括一行,這一行只包含一個整數,表示陶陶能夠摘到的蘋果的數目。

【輸入樣例】

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

【題目描述】

  下面是一個圖書的單價表:

  計算概論28.928.9元/本

  資料結構與演算法32.732.7元/本

  數字邏輯45.645.6元/本

  C++程式設計教程7878元/本

  人工智慧3535元/本

  計算機體系結構86.286.2元/本

  編譯原理27.827.8元/本

  作業系統4343元/本

  計算機網路5656元/本

  JAVA程式設計6565元/本

  給定每種圖書購買的數量,程式設計計算應付的總費用。

【輸入】

  輸入一行,包含1010個整數,分別表示購買的《計算概論》、《資料結構與演算法》、《數字邏輯》、《C++程式設計教程》、《人工智慧》、《計算機體系結構》、《編譯原理》、《作業系統》、《計算機網路》、《JAVA程式設計》的數量(以本為單位)。每兩個整數用一個空格分開。

【輸出】

  輸出一行,包含一個浮點數ff,表示應付的總費用。精確到小數點後一位。

【輸入樣例】

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

【題目描述】

  將一個數組中的值按逆序重新存放。例如,原來的順序為8,6,5,4,18,6,5,4,1。要求改為1,4,5,6,81,4,5,6,8

【輸入】

  輸入為兩行:第一行陣列中元素的個數n(1&lt;n&lt;100)n(1&lt;n&lt;100),第二行是nn個整數,每兩個整數之間用空格分隔。

【輸出】

  輸出為一行:輸出逆序後陣列的整數,每兩個整數之間用空格分隔。

【輸入樣例】

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

【題目描述】

  某醫院想統計一下某項疾病的獲得與否與年齡是否有關,需要對以前的診斷記錄進行整理,按照018,1935,3660,610-18,19-35,36-60,61以上(含6161)四個年齡段統計的患病人數佔總患病人數的比例。

【輸入】

  共22行,第一行為過往病人的數目n(0&lt;n100)n(0&lt;n≤100),第二行為每個病人患病時的年齡。

【輸出】

  按照018,1935,3660,610-18,19-35,36-60,61以上(含6161)四個年齡段輸出該段患病人數佔總患病人數的比例,以百分比的形式輸出,精確到小數點後兩位。每個年齡段佔一行,共四行。

【輸入樣例】

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

【題目描述】

  某校大門外長度為LL的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是11米。我們可以把馬路看成一個數軸,馬路的一端在數軸00的位置,另一端在LL的位置;數軸上的每個整數點,即0,1,2,...,L0,1,2,...,L都種有一棵樹。

  由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。

【輸入】

  第一行有兩個整數L(1L10000),M(1M100)L(1≤L≤10000),M(1≤M≤100)LL代表馬路的長度,MM代表區域的數目,LLMM之間用一個空格隔開。接下來的MM行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。

  對於20%20\%的資料,區域之間沒有重合的部分;對於其它的資料,區域之間有重合的情況。

【輸出】

  包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。

【輸入樣例】

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

【題目描述】

  線上性代數、計算幾何中,向量點積是一種十分重要的運算。給定兩個nn維向量a=(a1,a2,...,an),b=(b1,b2,...,bn)a=(a_1,a_2,...,a_n),b=(b_1,b_2,...,b_n),求點積a?b=a1b1+a2b2+...+anbna?b=a_1b_1+a_2b_2+...+a_nb_n

【輸入】

  第一行是一個整數n(1n1000)n(1≤n≤1000)

  第二行包含nn個整數a1,a2,...,ana_1,a_2,...,a_n

  第三行包含nn個整數b1,b2,...,b