眼看一学期又过去了,迎来了期末考试。
话不多说,让我们来看一看这些题。
问题 A(1301): 湖的深度
时间限制: 1 Sec 内存限制: 64 MB提交: 69 解决: 50
[ 提交][ 状态][ 我的提交]
题目描述
输入
输出
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
4 3
0 1 0
1 2 0
1 5 1
2 3 4
样例输出
1
提示
尽管5是最大值,但只有1是出现2次的相邻数。
代码如下
#include<cstdio>
#include<cstring>
const int M=55;
int a[M][M],r,c,dir1[8]={1,-1,0,0,-1,-1,1,1},dir2[8]={0,0,-1,1,-1,1,-1,1},max=0;//dir1表示行的移动,dir2表示列的移动
void ZT(int Y,int Z)
{
if(a[Y][Z]!=0&&a[Y][Z]>max)
for(int i=0;i<8;i++)
if(a[Y+dir1[i]][Z+dir2[i]]==a[Y][Z])
max=a[Y][Z];
return;
}
int main()
{
int i,j;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
scanf("%d",&a[i][j]);
ZT(i,j);
}
printf("%d",max);
return 0;
}
问题 B(2992): 队列
时间限制: 1 Sec 内存限制: 128 MB提交: 97 解决: 47
[ 提交][ 状态][ 我的提交]
题目描述
又到午饭时间了。HF 中学的学生们又冲到食堂排队买饭。假设当前只有一个窗口在售
饭。于是饥肠辘辘的学生们排成了长长的一个队列。
突然,一卡通的打卡机坏了。学生们不得不散开队列,或坐或站地到别处休息。队列散
开前,每个学生记住了他前边和后边的学生的编号(编号是一个非负整数,并且各不相同) 。
经过紧急抢修,打卡机恢复正常,学生们排成一列继续买饭。为了公平,需要重新恢复
成队列原来的顺序。
食堂纪律监督员虽然是个学渣,但有幸恰好是你的好朋友。他把这个恢复队列的任务交
给了作为 HF 编程社社长的你。
对于队列第一个学生,它的前边没有人,故用 0 表示。
对于队列最后一个学生,它的后边没有人,故用 0 表示。
输入
第 1 行:1 个整数 N(2<=N<=500),表示队列中有多少个整数
接下来 N 行,每行 2 个整数 Ai,Bi(0<=Ai,Bi<=1000),其中 Ai 是排在这名学生前面学生的编
号,Bi 是排在这名学生后面学生的编号。
输出
第 1 行:输出 N 个整数,分别表示队列初始时从前往后排列的学生的编号。
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
4
92 31
0 7
31 0
7 141
样例输出
92 7 31 141
提示
下图表示样例的初始队列
怎么找排头和排尾呢?
我们可以记录一下每个数(编号)出现的次数,我们会发现,除排头和排尾,其他都出现了两次。
代码如下:
#include<cstdio>
#include<cstring>
bool c[200001]={0};
const int M=200001;
int a[M],b[M];
int main()
{
int i,n,x,y;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[x]=y;
c[x]=!c[x];
c[y]=!c[y];
}
b[1]=a[0];
for(i=0;i<200001;i++)
if(c[i]&&a[i]!=0)
{
b[0]=i;
break;
}
for(i=0;i<n;i++)
b[i+2]=a[b[i]];
for(i=0;i<n-1;i++)
printf("%d ",b[i]);
printf("%d",b[n-1]);
return 0;
}
*
*
*
*
*
(未完待续……)