HAOI2015普及组试题

【第 1 题】单数还是双数(t1.c/cpp/pas)馨馨那个残酷的老师搞了一个有 N (1 <= N <= 100) 个正整数 I (1 <= I <= 10^60)的表叫馨馨去判断“奇偶性”(这个词语意思向初中生解释,就是“这个数是单数,还是双数啊?”)。馨馨被那个表的长度深深地震惊到了!毕竟她才刚上初中啊。写一个程序读入 N 个整数,如果是双数,那么输出一行"even",如果是单数则输出一行"odd"。

【输入】   第 1 行: 一个整数 N

                第 2~N+1 行: 每行一 个整数,需要判断“奇偶性”的数。

【输出】   第 1..N 行: 第 j 行根据第 j 个整数的奇偶性输出一个单词"even"或者"odd"。

【样例】输入(t1.in) 

2

1108        even

4211        odd


【样例解释】1108 可以被 2 整除; 而 4211 不可以

【题目分析】此题乍一看,太简单了,就是送分的,其实不然,要注意看清楚I的范围,是需要用字符串来处理的,不然会进坑的

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("t1.in","r",stdin);
	freopen("t1.out","w",stdout);
	int n;
	string s;
	cin>>n;
	for(int i=1;i<=n;i++)
		{
			cin>>s;
			int h=s.size();
			if((s[h-1]-'0')%2==0) cout<<"even"<<endl;
			else cout<<"odd"<<endl;
		}
	return 0;	
}

【第 2 题】相遇与同候(t2.c/cpp/pas)众所周知,现代初中生是很有礼貌的社交型学生:每当两个初中生分离后又相遇的时候,它们用“你好!”友好地相互打招呼,馨馨和她的朋友瑶瑶在学校的校园里的一条长长的羊肠小路上散步。 为了便于理解,我们可以把这条羊肠小路看作是一个:一维数轴。 馨馨和瑶瑶都从原点出发,而且她们在散步的这段时间内速度一样。 请根据两个学生各自的散步行动,算出她们互相之间打招呼“你好!”的次数。 经过一段时间之后,她们两个可以在不同的地点停止, 时间有限,两人都不能行走超过 1,000,000 的单位时间。

【输入】第一行:两个分开写的整数:B(1 <= B <= 50,000) 和 E(1 <= E <= 50,000)第 2..1+B:

这 B 行描述了馨馨的举动,每一行包含一个正整数表示距离和一个“L”(代表 left,左)或者“R”(代表 right,右)表示方向。 馨馨不是向左走就是向右走 。

第 2+B..1+B+E 行: 这 E 行描述了瑶瑶的举动,每一行包含一个正整数表示距离和一个“L”(代表 left,左)或者“R”(代表 right,右)表示方向,瑶瑶不是向左走就是向右走 。

【输出】只有一行:一个整数代表互相问候“你好!”的次数(她们两个最初在原点时在一起没有说“你好!”)

【样例】

4 5                                        3

3 L

5 R

1 L

2 R

4 R

1 L

3 L

4 R

2 L

【样例解释】输入解释:馨馨向左走了 3 个单位时间,然后向右走了 5 个单位时间,向左走1 个单位时间,最后向右走 2 个单位时间,然后她停在那里; 瑶瑶向右走了 4 个单位时间,然后向左走了 1 个单位时间,又向左走 3 个单位时间,接着向右走 4 单位时间,最后向左走 2 个单位时间,然后她停在那里。输出解释:馨馨和瑶瑶暂时分离后在时间点 7,9 和 13 相遇。

#include<bits/stdc++.h>
using namespace std;
int b,e,sum1=0,sum2=0,t=0,t1=0,t2=0,sum=0,x=0;
int a1,c1,b2[1000000]={},b1[1000000]={},a3[1000000]={},c3[1000000]={};
int main()
{
    freopen("t2.in","r",stdin);
	freopen("t2.out","w",stdout);
	scanf("%d %d",&b,&e);
	char ch;
	for(int i=1;i<=b;i++)//第一个人走过之后,标记每个点的值,并且用1代表向左,2代表向右
			{
				scanf("%d %c",&a1,&ch);
				sum1+=a1;//累计步数,
				for(int j=1;j<=a1;j++)
						if(ch=='L') //如果向左走,值减1,方向标记为1
						{	
							a3[++t1]=--x;
							b1[t1]=1;
						}
						else //如果向右走,值加1,方向标记为2		
					   {
						a3[++t1]=++x;
						b1[t1]=2;
					   }
			}
	x=0;
	for(int i=1;i<=e;i++)//第二个人走过之后,标记每个点的值,并且用1代表向左,2代表向右
			{
				scanf("%d %c",&c1,&ch);;
				sum2+=c1;//累计步数
				for(int j=1;j<=c1;j++)
					if(ch=='L') //如果向左走,值减1,方向标记为1
					{
						c3[++t2]=--x;
						b2[t2]=1;
					}		
				    else //如果向右走,值加1,方向标记为2
					{
						c3[++t2]=++x;
						b2[t2]=2;
					}
			}
	if(sum1<sum2)//走过的点数不同,把短的以最后一刻的值补齐
	 {
	 	t=sum2;
		for(int i=t1+1;i<=t;i++)
	    {
			a3[i]=a3[i-1];
			b1[i]=0;
		}
	} 
	else
	 {
		 t=sum1;
		 for(int i=t2+1;i<=t;i++)
		  {
		  c3[i]=c3[i-1];
		  b2[i]=0;
		  }
	}
	for(int i=1;i<=t;i++)//枚举每个点,如果值相同而方向不同,则计数器加1
		if(a3[i]==c3[i]&&b1[i]!=b2[i]) sum++;
	cout<<sum;
	return 0;
}

【第 3 题】测量池塘(t3.c/cpp/pas)馨馨正在校园西北角的一个池塘饮水,她发现这个池塘的底部很有趣,布满了小山包和小峡谷,她想知道池塘到底有多深。她划着一只小船,用一个破旧的快要读不出字来的雷达沿着池塘边缘转了一圈,她发现最深的地方相对比较平坦,而如果找到了两个相邻的读数相同,则这里就会是最深的地方。池塘底部的情况可由一个 R*C(1 <= R <= 50; 1 <= C <= 50)的矩阵来描述,矩阵中的数(正数)代表每个点的深度读数 D(0 <= D <= 1,000,000);有些地方可能为 0,这表示这些位置不属于池塘的组成部分,一个位置深度读数为 10 表示这个地方深度为 10。找出最大深度,即至少有两个相邻读数相同的深度,这里的“相邻”是指在矩阵中八个方向的相邻,即除了同一行、同一列,还可以在同一斜线上相邻。她知道池塘中至少有一对正的相邻读数相同。

【输入】

第 1 行,两个空格隔开的整数:R,C;

第 2~R+1 行,这 R 行中的第 i 行有 C 个空格隔开的整数,分别表示池塘第 i行的深度读数。

【输出】一行,一个整数,即按照馨馨的规则找到的池塘深度。

【样例】

4 3                             1

0 1 0

1 2 0

1 5 1

2 3 4


【样例解释】尽管最深的读数为 5,并且数字 2 出现了两次,但是因为有两个两邻的 1,故最深的地方应为 1。

#include<bits/stdc++.h>
using namespace std;
int a[60][60];
int main()
{
	freopen("t3.in","r",stdin);
	freopen("t3.out","w",stdout);
	int r,c,maxx=-100000;
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>a[i][j];
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
		if(((a[i][j]==a[i-1][j-1])||(a[i][j]==a[i-1][j])||(a[i][j]==a[i-1][j+1])||(a[i][j]==a[i][j-1])||(a[i][j]==a[i][j+1])||(a[i][j]==a[i+1][j-1])||(a[i][j]==a[i+1][j])||(a[i][j]==a[i+1][j+1]))&&a[i][j]>maxx)
		    maxx=a[i][j];
	cout<<maxx;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值