期末编程考试小结

来源:互联网 发布:人人商城2.0 源码下载 编辑:程序博客网 时间:2024/05/21 12:41

眼看一学期又过去了,迎来了期末考试。

话不多说,让我们来看一看这些题。

问题 A(1301): 湖的深度

时间限制: 1 Sec  内存限制: 64 MB
提交: 69  解决: 50
[提交][状态][我的提交]

题目描述

一个湖用 R x C (1 ≤ R ≤ 50; 1 ≤ C ≤ 50) 的网格表示。格点上的非负整数 D_rc (0 ≤ D_rc ≤ 1,000,000)表示该位置的深度。整数0表示该位置不是湖的一部分(有可能是湖岸,也有可能是湖中的小岛)。 由于测量误差,所以只有当某个格点的深度值和与它相邻的8个方向(上、下、左、右、另外4个是对角方向)格点中至少1个的深度值相等时,该格点的深度值才算作有效。 写一个程序,找出湖的最大的深度。

输入

第1行:2个空格分开的整数R和C;R表示行数,C表示列数 第2..R+1行:每行C个空格分开的整数,每个数表示一个格点的测量值D_rc

输出

第1行:1个整数,表示湖的最大深度。

样例输入

 (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

4 30 1 01 2 01 5 12 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 个整数,分别表示队列初始时从前往后排列的学生的编号。

样例输入

 (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

492 310 731 07 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;
}

*

*

*

*

*

(未完待续……)

原创粉丝点击