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

2010年合肥市市赛小学组-T1-  作息时间

题目描述 

小K告诉了小新自己一天的安排:“8:30:30去超市”、“9:10:10去朋友家”、“10:20:10去…”、…。
小新看着复杂的安排表,晕了头,因为时间太混乱了,小K没有按照时间先后告诉他。于是他需要你帮助他把这些时间按照先后顺序输出。

输入描述

第一行一个整数N表示有多少个时间;
之后N行,每行空格隔开3个数字,依次分别表示时,分,秒。
【数据范围】
对于70%的数据 N <= 1000;
对于100%的数据 N <= 15000;
保证输入格式为正常时间表示法,即时,分,秒都在[0,59]的范围内。

输出描述 

输出有N行,按照时间先后顺序输出所有的时间,输出的时候依然是每行3个空格隔开的数字,分别表示时,分,秒。
如果有2个时间是相同的,你仍然需要输出两次。

样例输入 

4

3 22 21

3 21 22

3 22 22

3 21 21

样例输出 

3 21 21

3 21 22

3 22 21

3 22 22

解析

考点:结构体排序

参考代码:

#include<bits/stdc++.h>
using namespace std;
struct Tim{
	int h,m,s;
}t[15010];
bool cmp(Tim x,Tim y){
	if(x.h!=y.h) return x.h<y.h;
	if(x.m!=y.m) return x.m<y.m;
	return x.s<y.s;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t[i].h>>t[i].m>>t[i].s;
	}
	sort(t+1,t+1+n,cmp);
	for(int i=1;i<=n;i++){
		cout<<t[i].h<<" "<<t[i].m<<" "<<t[i].s<<endl;
	}
	return 0;
}

2010年合肥市市赛小学组-T2- a+b

题目描述 

相信a+b问题对大家来说,应该不陌生了吧。给出两个整数a和b,求a和b的和。

输入描述 

第一行一个整数N(N<100),表示求和的数字对数;
接下来N行,每行两个整数a和b。
【数据范围】
对于70%的数据,0<=a,b<=1000;
对于100%的数据,0<=a,b<=10^100。

输出描述 

N行,每行一个数表示两个数a,b的和。

样例输入 

1

3 5

样例输出 

8

解析

考点:高精度加法

参考代码:

#include <iostream>
#include <cstring>
using namespace std;        
int a1[1001]={},b1[1001]={},c1[1001]={};
int main(){	
	int n;
	cin>>n;
	while(n--){
		char a[1001]={},b[1001]={};
		cin>>a>>b; 			
		int lena=strlen(a),lenb=strlen(b);
		//1.逆序存储转成整数 
		for(int i=0;i<lena;i++){
			a1[i]=a[lena-1-i]-48;
		}
		for(int i=0;i<lenb;i++){
			b1[i]=b[lenb-1-i]-48;
		}
		//2.获取最大两个数的最大长度 
		int len=lena>lenb?lena:lenb;
		//3.求和 
		int x=0;
		for(int i=0;i<len;i++){
			//三个数相加
			c1[i]=a1[i]+b1[i]+x;
			x=c1[i]/10; //处理新产生的进位 
			c1[i]=c1[i]%10; //保证数组c每个元素仅包含一个数字 
		}
		//4.处理最高位的进位问题 
		if(x){
			c1[len]=x; 
			cout<<c1[len];
		}
		//5.倒序输出,输出和的其他部分
		for(int i=len-1;i>=0;i--){
			cout<<c1[i];
		} 
		cout<<endl;
	}
	
	return 0;
}

2010年合肥市市赛小学组-T3- 双胞胎的烦恼

有一对双胞胎(哥哥和妹妹),关系特别好,什么事都相互谦让。唯独每年到他们生日的那天,他们就会或多或少的有一些不愉快,渐渐的,成了他们的烦恼。
事情是这样的。每年到他们过生日的时候,亲朋好友都会给他们送来礼物,表示祝贺。有的人给他们买同样的礼物,有的人买不一样的礼物。每件礼物都有相应的价值。送礼物的人都没有明确说哪个礼物给谁,作为两个双胞胎,他们都希望自己收到的礼物价值高些。这不,今年生日所有的朋友送的礼物都是2本书(可能是希望他们好好读书吧),一本给哥哥,一本给妹妹。为了减少矛盾,双胞胎的妈妈让你来帮忙分配,要求使得两人所获得书本的价值和之间的差距尽可能的小(差距越小,双胞胎之间的不愉快程度越低)。
例如,有4个人送礼物,每个人的礼物价值(两个数)用一对括号括起来表示,如:(3,5),(7,11),(8,8),(2,9),可以把3,7,8,2分配给妹妹,其余的给哥哥,价值差为:5+11+8+9-3-7-8-2=13;也可以把3,7,8,9给妹妹,其余的给哥哥,价值差为:3+7+8+9-5-11-8-2=1,这是最好的方案。

输入描述 

第一行包含一个整数N(1≤N≤30),表示礼物的数量,接下来N行,每行两个整数,表示每份礼物两本书的价值(价值范围在1到30之间)。

输出描述 

输出一个非负整数,表示最小的价值差。

样例输入 

4

3 5

7 11

8 8

2 9

样例输出 

1

解析

考点:01背包

思路:问题等价于从n个礼品中选择一些,使得这些礼品的价值和不超过所有礼品总价值的一半。

由于要求最小的价值差,问题转化为从n个礼品中选择一些放入沉重为为所有礼品总价值一半的背包中所有取得的最大值。最小差值=sum-2*max(f[i,sum/2);

参考代码:

#include<bits/stdc++.h>
using namespace std;
int f[100]; 
int a[100];
int main(){
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=2*n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	//物品 
	for(int i=1;i<=2*n;i++){
		for(int j=sum/2;j>=a[i];j--){ //背包 
			f[j]=max(f[j],f[j-a[i]]+a[i]);
		}
	}
	cout<<sum-2*f[sum/2];
	return 0;
}

2010年合肥市市赛小学组-T4-  蚂蚁

题目描述 

蚂蚁在回家路上,他的任务自然是回家。蚂蚁在一个w*h个方格的地图上。每秒钟他能向上下左右四个方向移动一格,但不能离开地图。由于蚂蚁体能有限,每秒钟他要消耗1点HP, 刚开始时他有满HP6点。他可以沿路通过进食来补满HP(即6点),只要他走到有食物的格子,他不需要任何时间即可进食完毕。一个格子上的食物量对于小蚂蚁来说是庞大的,只要他愿意,每次经过这个格子都有吃不完的食物。
一旦蚂蚁的HP降到0,他将死去,就算到了某个有食物的格子才死去,他也不能通过进食补满HP。即使再家门口死去,他也不能算完成任务回到家中。
地图上有5种格子:
数字0:表示障碍物,蚂蚁不能走到这个格子上,更不能跨越。
数字1:表示空地,蚂蚁可以自由行走
数字2:表示蚂蚁出发点,他也是一片空地。
数字3:表示蚂蚁的家。
数字4:表示有食物在上面的空地。
你能告诉蚂蚁先生他能否安全回家,如果能,最短需要多长时间呢?

输入描述 

第一行,表示宽w和长h。
下面h行,每行w个数字来描述地图。
【数据规模】
0<w,h<9

输出描述 

一行,若蚂蚁不能回家,输出-1,否则输出蚂蚁回家所需最短时间。

样例输入 

3 3

2 1 1

1 1 0

1 1 3

样例输出 

4

解析

考点:深搜 DFS

参考代码

#include<iostream>
using namespace std;
int dx[5]={-1,0,1,0},dy[5]={0,1,0,-1};
int m[20][20],vis[20][20];
int  w,h,sx,sy,ex,ey,minn=100000;
bool flag=0;
void dfs(int x,int y,int step,int s){
	if(s<0) return ; //HP不足 
	if(x==ex&&y==ey){ //到达终点,打擂台 
		if(step<minn){
			minn=step;
		}
		flag=1;
		return ;
	}
	for(int i=0;i<4;i++){
		int tx=x+dx[i];
		int ty=y+dy[i];
		//不越界 
		if(tx>=1&&tx<=h&&ty>=1&&ty<=w&&m[tx][ty]!=0&&vis[tx][ty]==0){
			vis[tx][ty]=1;
			if(m[tx][y]==1){ //空地 
				dfs(tx,ty,step+1,s-1); 
			}else if(m[tx][y]==4){ //有食物补充HP 
				dfs(tx,ty,step+1,6);
			}
			vis[tx][ty]=0;  //回溯 
		}
	}
}
int main(){	
	cin>>w>>h;
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			cin>>m[i][j];
			if(m[i][j]==2){  //记录起点
				sx=i;
				sy=j;
			}
			if(m[i][j]==3){ //记录终点
				ex=i;
				ey=j;
			}
		}
	} 
	dfs(sx,sy,0,6); 
	if(flag==1) 
		cout<<minn;
	else
		cout<<-1;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值