2009年合肥市信息学科普日市赛-小学组真题解析

2009年合肥市市赛小学组-T1-   乘车费用

题目描述 

元旦快到了,小W的班级准备举办元旦庆祝活动,小W和几个同学一起帮助班主任老师进行准备。小W带着几个同学乘坐出租车去买东西。在出租车上,他们向司机师傅了解到出租车计价方案为:2.5公里以内起步价是6元,超过2.5公里之后按1.2元/公里计价,超过10公里之后在1.2元/公里的基础上加价50%,另外,停车等候时间则按时间计费后加入总价:1元/5分(注:不满5分钟不计费)。好奇的小W想自己先估算一下大概要多少费用。已知:小W等人乘坐出租车路程为N公里,中间停车等候时间总共M分钟,请计算小W应付的出租车费用是多少元?

输入描述 

输入文件共有一行,包含两个整数N,M,分别表示出租车行驶的里程和中间停车的时间,中间以空格分开,0≤N≤200,0≤M≤60。

输出描述 

输出仅包含一个整数,表示小W应付的乘车费用,四舍五入到整数元。

样例输入 

8 7

样例输出 

14

解析

考点:分段费用问题

参考代码:

#include
using namespace std;
int main(){
	int n,m; 
	double s=0;
	cin>>n>>m;
	if(n<=2.5) s=6+m/5;
	else if(n<=10) s=6+(n-2.5)*1.2+m/5;
	else s=15+(n-10)*1.8+m/5;
	cout<<(int)(s+0.5);
	return 0;
}

2009年合肥市市赛小学组-T2-   围墙重建

题目描述 

为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由于学校太大,重建围墙也不是一件小项目,学校决定请专门的建筑公司来建筑。
许多建筑公司从网上得知这个消息后,纷纷来到学校,找到学校领导,对自己公司进行介绍,并希望能接下这个项目。学校领导对很多家公司印象都还不错,难以取舍,为了公平,学校决定通过竞标决定把这个项目交给哪家公司负责。这次竞标是由学校自主决定的,不但要注重建筑实力,而且还要看建筑公司是否有足够的智慧。
学校通过两轮选拔。第一轮,选出建筑实力较强的公司。进入第二轮后,由学校专门负责这个项目的领导进行智力考核。
领导说:为了美观,我们准备建设一面2米高的围墙,围墙建好后,墙外要贴上有图画的瓷砖,当然这就需要瓷砖越大越美观了。目前市面用的最大瓷砖是多大?
公司:宽1米,长2米的
领导:哦,我们就用这种吧,我们学校需建筑N米长的围墙,如果用这种瓷砖来贴,总共有多少种贴法呢?
公司:…………….(正在计算中……………)

输入描述 

输入文件为一个数N(1
对于20%的数据,2
对于60%的数据,2
对于100%的数据,2< N<10000。

输出描述 

输出一个数,表示如果用宽1米、长2米,贴在高2米,长N米的围墙上,最多有多少种贴法?(输出数据后需换行)

样例输入 Sample Input

【样例输入1】 4

【样例输入2】 6

样例输出 Sample Output

【样例输出1】 5

【样例输出2】 13

解析

考点:递推+高精度

【递推公式】f(n) = f(n-1)+f(n-2)

【初始状态】f(1)=1; f(2)=2;

剩下部分就是高精度加法,直接模板就可以了

参考代码:

#include 
using namespace std;
const int N = 1e4+5;
int n, i;
string a[10000] = {"0","1","2"};//初始前两项的值 
//高精度加法 
string add(string a, string b) {
    string c;
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    int t = 0;
    for (int i = 0; i < a.size() || i < b.size(); i++) {
        if (i < a.size()) t += a[i] - '0';
        if (i < b.size()) t += b[i] - '0';
        c.push_back(t % 10 + '0');
        t /= 10;
    }
    if (t) c.push_back(t % 10 + '0');
    reverse(c.begin(), c.end());
    return c;
}

int main(){
    cin >> n;    
    for(i = 3; i<= n; i++)
    	//递推 
        a[i] = add(a[i-1], a[i-2]);
	cout<

2009年合肥市市赛小学组-T3-  足球联赛

题目描述 

为了庆祝元旦,J市决定举办全市小学足球联赛。各学校积极响应,共有N支球队报名参加,爱好足球的小W也参加了。为了活动的开展和不影响学生学习,只能安排K场比赛,每支球队最多参加两场比赛,至少参加零场比赛。因球队水平不同,每支球队都拥有一个和其他球队不同的水平等级(用一个正整数来表示)。在比赛中,等级高的球队必须作为客场,等级低的球队必须作为主场。每个球队最多只能做一次主场和一次客场。为了增加比赛的观赏度,观众希望K场比赛中球队水平差距的总和最小。比如有7支球队,他们的等级分别是30、17、26、41、19、38、18,要进行3场比赛。那么最好安排是球队2 vs 球队7, 球队7 vs 球队5 ,球队6 vs 球队4,此时等级差的总和等于(18-17) + (19-18) + (41-38) = 5达到最小。

输入描述 

第一行两个正整数N ,K。
接下来有N 行,第i行表示第i 支球队的等级。

对于20%的数据,1≤N≤300
对于80%的数据,1≤N≤5000
对于100%的数据,1≤N≤10000
保证所有输入数据中等级的值小于32000,1 ≤K≤ N-1

输出描述 

共一行,输出最小的等级差的总和。

样例输入 

7 3

30

17

26

41

19

38

18

样例输出 

5

解析

考点:贪心

思路:

对等级值从小到大排序,然后计算相邻的等级差值,这样计算的结果差值肯定都是最小的,再对等级差值从小到大排序。

参考代码:

#include
using namespace std;
int n,k,cnt=0;
int a[10010],b[10010]; 
long long ans=0;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	//从小到大排序
	sort(a+1,a+1+n);
	//计算相邻的两个数的差值
	for(int i=2;i<=n;i++){
		b[++cnt]=a[i]-a[i-1];
	} 
	//对b数组从小到大排序
	sort(b+1,b+1+cnt);
    //取出前k个最小的
	for(int i=1;i<=k;i++){
		ans+=b[i];
	}
	cout<

2009年合肥市市赛小学组-T4-  走迷宫

题目描述 

小W来到一个迷宫游玩,他发现迷宫非常特别。这个迷宫共有N层楼,配备了一个特别的电梯。迷宫的每一层都可以停电梯,而且第i层 (1<=i<=N)上有一个数字Ki(0<=Ki<=N),电梯内只提供四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:4 2 1 2 5代表了Ki(K1=4,K2=2,……),从一楼开始。在一楼,按“上”可以到5楼,按“下”是不起作用的,因为没有-3楼。进入迷宫中的人都想尽可能地少按电梯到达目的地,假如给你出发楼层A和目的楼层B,请你帮忙求出从A层到B层至少要按几次按钮。

输入描述 

输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

输出描述

输出文件仅一行,即最少按键次数,若无法到达,则输出-1。

样例输入 

5 1 5

4 2 1 2 5

样例输出 

1

解析

考点:广搜BFS

广搜的模板题

参考代码

#include 
using namespace std;
int n, a, b;
int x[205], step[205];   //step[i]到达楼层i需要的时间 
queue q;
void bfs(){
    q.push(a);
    step[a]=0;
    while(!q.empty()){
        int t = q.front();
        q.pop();
        if(t == b) {cout<=1&&!step[t-x[t]]){   //Down,不越界 & 没到过 
            q.push(t - x[t]);
            step[t-x[t]]=step[t]+1;   //按一次 
        }
        
        if(t+x[t]<=n&&!step[t+x[t]]){   //Up,不越界 & 没到过 
            q.push(t+x[t]);
            step[t+x[t]]=step[t]+1;   //按一次 
        }
    }
    cout<<-1;   //到不了 
}

int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++)
        cin >> x[i]; 
    bfs();
}

你可能感兴趣的:(合肥市赛小学组)