1. 程式人生 > >NOI題庫答案(1.5 程式設計基礎之迴圈控制)(1—20題)

NOI題庫答案(1.5 程式設計基礎之迴圈控制)(1—20題)

01:求平均年齡

總時間限制: 1000ms        記憶體限制: 65536kB

描述

班上有學生若干名,給出每名學生的年齡(整數),求班上所有學生的平均年齡,保留到小數點後兩位。

輸入

第一行有一個整數n(1<= n <= 100),表示學生的人數。其後n行每行有1個整數,表示每個學生的年齡,取值為15到25。

輸出

輸出一行,該行包含一個浮點數,為要求的平均年齡,保留到小數點後兩位。

樣例輸入

2
18
17

樣例輸出

17.50
#include <stdio.h>
using namespace std;
int main ()
{
	int n,a,i;
	float sum=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a);
		sum+=a;
	}
	printf("%.2f",sum/n);
	return 0;
}

02:財務管理

總時間限制: 1000ms        記憶體限制: 65536kB

描述

Larry今年畢業並找到了一份工作。他賺很多錢,但似乎總是不夠。Larry認為他需要控制他的投資以解決自己的財務問題。Larry拿到了自己的銀行賬戶詳單,想看看自己有多少錢。請幫助Larry寫一個程式,通過過去12個月中每月的月末結餘,計算平均結餘。

輸入

輸入包含12行,每行包含一個數,為某個月的結餘。每個數都是不大於1,000,000的正數,保留兩位小數,省略"$"符。

輸出

輸出一個數,為這12個月的平均月末結餘,保留到小數點後第二位,並在最前面加一個"$"符。

樣例輸入

100.00
489.12
12454.12
1234.10
823.05
109.20
5.27
1542.25
839.18
83.99
1295.01
1.75

樣例輸出

$1581.42
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	float a[12],sum=0;
	int i;
	for(i=0;i<12;i++)
		cin>>a[i];
	for(i=0;i<12;i++)
	{
		sum+=a[i];
	}
	printf("$%.2lf",sum/12);
        return 0;
}

03:均值

總時間限制: 1000ms        記憶體限制: 65536kB

描述

給出一組樣本資料,計算其均值。

輸入

輸入有兩行,第一行包含一個整數n(n小於100),代表樣本容量;第二行包含n個絕對值不超過1000的浮點數,代表各個樣本資料。

輸出

輸出一行,包含一個浮點數,表示均值,精確到小數點後4位。

樣例輸入

2
1.0 3.0

樣例輸出

2.0000
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
	int n,i;
	double a[100],j=0;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		j+=a[i];
	}
	printf("%.4lf",j/n);
	return 0;
}

04:求整數的和與均值

總時間限制: 1000ms        記憶體限制: 65536kB

描述

讀入n(1 <= n <= 10000)個整數,求它們的和與均值。

輸入

輸入第一行是一個整數n,表示有n個整數。
第2~n+1行每行包含1個整數。每個整數的絕對值均不超過10000。

輸出

輸出一行,先輸出和,再輸出平均值(保留到小數點後5位),兩個數間用單個空格分隔。

樣例輸入

4
344
222
343
222

樣例輸出

1131 282.75000
#include <stdio.h>
using namespace std;
int main()
{
	int n,i,s[10000];
	long sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&s[i]);
		sum+=s[i];
	}	
	printf("%d %.5lf",sum,(double)sum/n);
        return 0;
}

05:最高的分數

總時間限制: 1000ms         記憶體限制: 65536kB

描述

孫老師講授的《計算概論》這門課期中考試剛剛結束,他想知道考試中取得的最高分數。因為人數比較多,他覺得這件事情交給計算機來做比較方便。你能幫孫老師解決這個問題嗎?

輸入

輸入兩行,第一行為整數n(1 <= n < 100),表示參加這次考試的人數.第二行是這n個學生的成績,相鄰兩個數之間用單個空格隔開。所有成績均為0到100之間的整數。

輸出

輸出一個整數,即最高的成績。

樣例輸入

5
85 78 90 99 60

樣例輸出

99
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,t;
	int a[105];
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	for(j=0;j<n;j++)
	{
		for(i=0;i<j;i++)
		{
			if(a[i+1]<a[i])
			{
				t=a[i+1];
				a[i+1]=a[i];
				a[i]=t;                    //交換次序
			}
		}
	}
	cout<<a[n-1];
	return 0;
}

06:整數序列的元素最大跨度值

總時間限制: 1000ms        記憶體限制: 65536kB

描述

給定一個長度為n的非負整數序列,請計算序列的最大跨度值(最大跨度值 = 最大值減去最小值)。 

輸入

一共2行,第一行為序列的個數n(1 <= n <= 1000),第二行為序列的n個不超過1000的非負整數,整數之間以一個空格分隔。

輸出

輸出一行,表示序列的最大跨度值。

樣例輸入

6
3 0 8 7 5 9

樣例輸出

9
#include <iostream>
using namespace std;
int main()
{
	int n,i,j,t;
	int a[1005];
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	for(j=0;j<n-1;j++)
	{
		for(i=0;i<n-j-1;i++)
		{
			if(a[i+1]<a[i])
			{
				t=a[i+1];
				a[i+1]=a[i];
				a[i]=t;                    //交換次序
			}
		}
	}
	cout<<a[n-1]-a[0];
	return 0;
}

07:奧運獎牌計數

總時間限制: 1000ms        記憶體限制: 65536kB

描述

2008年北京奧運會,A國的運動員參與了n天的決賽專案(1≤n≤17)。現在要統計一下A國所獲得的金、銀、銅牌數目及總獎牌數。

輸入

輸入n+1行,第1行是A國參與決賽專案的天數n,其後n行,每一行是該國某一天獲得的金、銀、銅牌數目,以一個空格分開。

輸出

輸出1行,包括4個整數,為A國所獲得的金、銀、銅牌總數及總獎牌數,以一個空格分開。

樣例輸入

3
1 0 3
3 1 0
0 3 0

樣例輸出

4 4 3 11
#include <iostream>
using namespace std;
int main()
{
	int n,i,x=0,y=0,z=0;
	int a[20],b[20],c[20];
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i]>>b[i]>>c[i];
	for(i=0;i<n;i++)
	{
		x+=a[i];
		y+=b[i];
		z+=c[i];                    //對應相加即可
	}
	cout<<x<<" "<<y<<" "<<z<<" "<<x+y+z;
	return 0;
}

08:多邊形內角和

總時間限制: 1000ms        記憶體限制: 65536kB

描述

在歐幾里德幾何中,n邊形的內角和是(n-2)*180°。已知其中(n-1)個內角的度數,就能計算出剩下的一個未知內角的度數。請編寫一個程式,來解決這個問題。

輸入

第1行只有一個整數n(2第2行有(n-1)個正整數,是每個已知內角的度數。相鄰兩個整數之間用單個空格隔開。
資料保證給定多邊形合法。

輸出

一個正整數,為未知內角的度數。

樣例輸入

3
45 60

樣例輸出

75
#include <iostream>
using namespace std;
int main()
{
	int n,a,i,s=0;
	cin>>n;
	for(i=1;i<n;i++)
	{
		cin>>a;
		s+=a;
	}
	cout<<(n-2)*180-s;
	return 0;
}

09:奇數求和

總時間限制: 1000ms         記憶體限制: 65536kB

描述

計算非負整數 m 到 n(包括m 和 n )之間的所有奇數的和,其中,m 不大於 n,且n 不大於300。例如 m=3, n=12, 其和則為:3+5+7+9+11=35。

輸入

兩個數 m 和 n,兩個數以一個空格分開,其中 0 <= m <= n <= 300 。

輸出

輸出一行,包含一個整數,表示m 到 n(包括m 和 n )之間的所有奇數的和

樣例輸入

7 15

樣例輸出

55
#include <iostream>
using namespace std;
int main()
{
	int m,n,i,sum=0;
	cin>>m>>n;
	for(i=m;i<=n;i++)
	{
		if(i%2==1)
		{
			sum+=i;                //如果為奇數,則相加
		}
	}
	cout<<sum;
	return 0;
}

10:滿足條件的數累加

總時間限制: 1000ms         記憶體限制: 65536kB

描述

將正整數 m 和 n 之間(包括 m 和 n)能被 17 整除的數累加。其中,0 < m < n < 1000。

輸入

一行,包含兩個整數m和n,其間,以一個空格間隔。

輸出

輸出一行,包行一個整數,表示累加的結果。

樣例輸入

50 85

樣例輸出

204
#include <iostream>
using namespace std;
int main()
{
	int m,n,i,sum=0;
	cin>>m>>n;
	for(i=m;i<=n;i++)
	{
		if(i%17==0)                //找到能被17整除的數
		{
			sum+=i;                //相加
		}    
	}
	cout<<sum;
	return 0;
}

11:整數的個數

總時間限制: 1000ms        記憶體限制: 65536kB

描述

給定k(1< k < 100)個正整數,其中每個數都是大於等於1,小於等於10的數。寫程式計算給定的k個正整數中,1,5和10出現的次數。

輸入

輸入有兩行:第一行包含一個正整數k,第二行包含k個正整數,每兩個正整數用一個空格分開。

輸出

輸出有三行,第一行為1出現的次數,,第二行為5出現的次數,第三行為10出現的次數。

樣例輸入

5
1 5 8 10 5 

樣例輸出

1
2
1
#include <iostream>
using namespace std;
int main()
{
	int k,i,j,x=0,y=0,z=0;
	int a[105];
	cin>>k;
	for(i=0;i<k;i++)
		cin>>a[i];
	for(i=0;i<k;i++)
	{
		if(a[i]==1)
			x++;
		if(a[i]==5)
			y++;
		if(a[i]==10)
			z++;
	}
	cout<<x<<endl;
	cout<<y<<endl;
	cout<<z<<endl;
        return 0;
}

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

總時間限制: 1000ms        記憶體限制: 65536kB

描述

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

輸入

輸入包含2行:
第1行為N和m,表示整數序列的長度(N <= 100)和指定的數字, 中間用一個空格分開;
第2行為N個整數,整數之間以一個空格分開。

輸出

輸出為N個數中與m相同的數的個數。

樣例輸入

3 2
2 3 2

樣例輸出

2
#include <iostream>
using namespace std;
int main()
{
	int n,m,i,sum=0;
	int a[105];
	cin>>n>>m;
	for(i=0;i<n;i++)
		cin>>a[i];
	for(i=0;i<n;i++)
		if(a[i]==m)
			sum++;
	cout<<sum;
	return 0;
}

13:乘方計算

總時間限制: 1000ms        記憶體限制: 65536kB

描述

給出一個整數a和一個正整數n,求乘方an。

輸入

一行,包含兩個整數a和n。-1000000 <= a <= 1000000,1 <= n <= 10000。

輸出

一個整數,即乘方結果。題目保證最終結果的絕對值不超過1000000。

樣例輸入

2 3

樣例輸出

8
#include <iostream>
using namespace std;
int main ()
{
	int a,i,n,s=1;
	cin>>a>>n;
	for(i=1;i<=n;i++)
		s=s*a;
	cout<<s;
	return 0;
}

14:人口增長問題

總時間限制: 1000ms        記憶體限制: 65536kB

描述

我國現有x億人口,按照每年0.1%的增長速度,n年後將有多少人?

輸入

一行,包含兩個整數x和n,分別是人口基數和年數,以單個空格分隔。

輸出

輸出最後的人口數,以億為單位,保留到小數點後四位。1 <= x <= 100, 1 <= n <= 100。

樣例輸入

13 10

樣例輸出

13.1306
#include <iostream>
using namespace std;
int main()
{
	int n,i;
	double x;
	int a[105];
	cin>>x>>n;
	for(i=0;i<n;i++)
		x*=(1+0.001);
	printf("%.4lf",x);
	return 0;
}

15:銀行利息

總時間限制: 1000ms        記憶體限制: 65536kB

描述

農夫約翰在去年賺了一大筆錢!他想要把這些錢用於投資,並對自己能得到多少收益感到好奇。已知投資的複合年利率為R(0到20之間的整數)。約翰現有總值為M的錢(100到1,000,000之間的整數)。他清楚地知道自己要投資Y年(範圍0到400)。請幫助他計算最終他會有多少錢,並輸出它的整數部分。資料保證輸出結果在32位有符號整數範圍內。

輸入

一行包含三個整數R,M,Y,相鄰兩個整數之間用單個空格隔開。

輸出

一個整數,即約翰最終擁有多少錢(整數部分)。

樣例輸入

5 5000 4

樣例輸出

6077

提示

在樣例中,
第一年後: 1.05 * 5000 = 5250
第二年後: 1.05 * 5250 = 5512.5
第三年後: 1.05 * 5512.50 = 5788.125
第四年後: 1.05 * 5788.125 = 6077.53125
6077.53125的整數部分為6077。

#include <iostream>
using namespace std;
int main()
{
	int r,y,i;
	double s,m;
	cin>>r>>m>>y;
	for(i=0;i<y;i++)
		m*=(1+0.01*r);
	cout<<(int)m;                //把m強制轉換成int型別
	return 0;
}

16:買房子

總時間限制: 1000ms        記憶體限制: 65536kB

描述

某程式設計師開始工作,年薪N萬,他希望在中關村公館買一套60平米的房子,現在價格是200萬,假設房子價格以每年百分之K增長,並且該程式設計師未來年薪不變,且不吃不喝,不用交稅,每年所得N萬全都積攢起來,問第幾年能夠買下這套房子?(第一年年薪N萬,房價200萬)

輸入

一行,包含兩個正整數N(10 <= N <= 50), K(1 <= K <= 20),中間用單個空格隔開。

輸出

如果在第20年或者之前就能買下這套房子,則輸出一個整數M,表示最早需要在第M年能買下,否則輸出Impossible。

樣例輸入

50 10

樣例輸出

8
#include <stdio.h>
using namespace std;
int main()
{
	double n,k,m,s=200,a=0;        //n為年薪,k為增長率,m為買下房子的時間,a為第幾年後的年薪和
	scanf("%lf %lf",&n,&k);
	for(m=1;m<=20;m++)
	{
		a=a+n;                        //年薪相加
		if(a>=s)                    //年薪和大於房價
		{
			printf("%g",m);
			return 0;
		}
		s=s*(k/100+1);                //增長後的房價
	}
	printf("Impossible");
	return 0;
}

17:菲波那契數列

總時間限制: 1000ms         記憶體限制: 65536kB

描述

菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。
給出一個正整數k,要求菲波那契數列中第k個數是多少。

輸入

輸入一行,包含一個正整數k。(1 <= k <= 46)

輸出

輸出一行,包含一個正整數,表示菲波那契數列中第k個數的大小

樣例輸入

19

樣例輸出

4181
#include <iostream>
using namespace std;
int main()
{
	int k,i,sum=0;
	int a[50];
	cin>>k;
	a[0]=1;
	a[1]=1;
	for(i=2;i<=k;i++)            //起始時i=2而不是i=0,因為當i=0時,a[i-2]不成立
		a[i]=a[i-1]+a[i-2];        
	cout<<a[k-1];
	return 0;
}

18:雞尾酒療法

總時間限制: 1000ms        記憶體限制: 65536kB

描述

雞尾酒療法,原指“高效抗逆轉錄病毒治療”(HAART),由美籍華裔科學家何大一於1996年提出,是通過三種或三種以上的抗病毒藥物聯合使用來治療艾 滋病。該療法的應用可以減少單一用藥產生的抗藥性,最大限度地抑制病毒的複製,使被破壞的機體免疫功能部分甚至全部恢復,從而延緩病程進展,延長患者生 命,提高生活質量。人們在雞尾酒療法的基礎上又提出了很多種改進的療法。為了驗證這些治療方法是否在療效上比雞尾酒療法更好,可用通過臨床對照實驗的方式 進行。假設雞尾酒療法的有效率為x,新療法的有效率為y,如果y-x大於5%,則效果更好,如果x-y大於5%,則效果更差,否則稱為效果差不多。下面給 出n組臨床對照實驗,其中第一組採用雞尾酒療法,其他n-1組為各種不同的改進療法。請寫程式判定各種改進療法效果如何。

輸入

第一行為整數n( 1 < n <= 20);
其餘n行每行兩個整數,第一個整數是臨床實驗的總病例數(小於等於10000),第二個療效有效的病例數。
這n行資料中,第一行為雞尾酒療法的資料,其餘各行為各種改進療法的資料。

輸出

有n-1行輸出,分別表示對應改進療法的效果:
如果效果更好,輸出better;如果效果更差,輸出worse;否則輸出same

樣例輸入

5
125 99
112 89
145 99
99 97
123 98

樣例輸出

same
worse
better
same
#include <iostream>
using namespace std;
int main()
{
	int n,i;
	double x,y;
	double a[25],b[25];
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i]>>b[i];
	x=b[0]/a[0];
	for(i=1;i<n;i++)
	{
		y=b[i]/a[i];
		if((y-x)>0.05)
			cout<<"better"<<endl;
		else if((x-y)>0.05)
			cout<<"worse"<<endl;
		else
			cout<<"same"<<endl;
	}
	return 0;
}

19:救援

總時間限制: 1000ms        記憶體限制: 65536kB

描述

救生船從大本營出發,營救若干屋頂上的人回到大本營,屋頂數目以及每個屋頂的座標 
和人數都將由輸入決定,求出所有人都到達大本營並登陸所用的時間。 

在直角座標系的原點是大本營,救生船每次從大本營出發,救了人之後將人送回大本營。座標系中的點代表屋頂,每個屋頂由其位置座標和其上的人數表 示。救生船每次從大本營出發,以速度50 米/分鐘駛向下一個屋頂,達到一個屋頂後,救下其上的所有人,每人上船1 分鐘,船原路返回,達到大本營,每人下船0.5 分鐘。假設原點與任意一個屋頂的連線不穿過其它屋頂。

輸入

第一行,一個整數,表示屋頂數n。
接下來依次有n 行輸入,每一行上包含兩個表示屋頂相對於大本營的平面座標位置的實數(單位是米)、一個表示人數的整數,數之間以一個空格分
開。

輸出

一行,救援需要的總時間,精確到分鐘 (向上取整)。

樣例輸入

1
30 40 3

樣例輸出

7
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n,people;
    double x,y,d,time=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x>>y>>people;
        d=sqrt(x*x+y*y)*2; 
        time+=1.5*people+d/50;
    }
    cout<<ceil(time)<<endl;        //ceil向上取整,取大於或等於它本身的整數,需包含<cmath>
    return 0;
}

20:球彈跳高度的計算

總時間限制: 1000ms         記憶體限制: 65536kB

描述

一球從某一高度落下(整數,單位米),每次落地後反跳回原來高度的一半,再落下。
程式設計計算氣球在第10次落地時,共經過多少米? 第10次反彈多高?

輸入

輸入一個整數h,表示球的初始高度。

輸出

輸出包含兩行:
第1行:到球第10次落地時,一共經過的米數。
第2行:第10次彈跳的高度。

注意:結果可能是實數,結果用double型別儲存。
提示:輸出時不需要對精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。

樣例輸入

20

樣例輸出

59.9219
0.0195313
#include <iostream>
using namespace std;
int main()
{
	double h,s=0;
	cin>>h;
	for(int i=0;i<10;i++)
        {
		s+=1.5*h;
		h/=2;
	}
	s-=h;
	cout<<s<<endl;
	cout<<h<<endl;
	return 0;
}

//h的結果為0.0195312,原題給的示例為0.0195313,我想可能給錯了,用這個程式碼也是一樣可以通過的

以上即為NOI 1.5部分的1—20題題目,歡迎指正!