A
题目
给出n个数,zjm想找出出现至少(n+1)/2次的数, 现在需要你帮忙找出这个数是多少?
输入
本题包含多组数据:
每组数据包含两行。
第一行一个数字N(1<=N<=999999) ,保证N为奇数。
第二行为N个用空格隔开的整数。
数据以EOF结束。
输出
对于每一组数据,你需要输出你找到的唯一的数。
样例
样例输入:
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
样例输出:
3
5
1
分析
根据题意就是将相同的合并,求相同数最多的,可以用map ,如果map 之前出现有,则mp[a[i]]++; 如果之前没有,则mp[a[i]]=1;
最后遍历map,输出量大于(n+1)/2 的.
代码
#include<stdio.h>
#include<map>
#define maxn 1000000
using namespace std;
int a[maxn];
int b[maxn];
int main()
{
int n,x;
map<int ,int> mp;
while(scanf("%d",&n)!=EOF)
{
mp.clear();
x = (n+1) / 2;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(mp.find(a[i])!=mp.end()) mp[a[i]]++;
else mp[a[i]]=1;
}
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
if(it->second >= x){
printf("%d\n",it->first);
break;
}
}
}
return 0;
}
B
题目
zjm被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成。
zjm每次向上下前后左右移动一个单位需要一分钟,且zjm不能对角线移动。
空间的四周封闭。zjm的目标是走到空间的出口。
是否存在逃出生天的可能性?如果存在,则需要多少时间?
输入
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度,R和C分别表示每层空间的行与列的大小。
随后L层,每层R行,每行C个字符。
每个字符表示空间的一个单元。’#‘表示不可通过单元,’.‘表示空白单元。
zjm的起始位置在’S’,出口为’E’。每层空间后都有一个空行。
L,R和C均为0时输入结束。
输出
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
样例
样例输入:
3 4 5
S….
.###.
.##…
###.#
##.##
##…
#.###
####E
1 3 3
S##
#E#
0 0 0
样例输出:
Escaped in 11 minute(s).
Trapped!
分析
带距离的三维的dfs 问题,和二维的写法相同,自己根据输入确定起点和终点。感觉cin 在有换行和空格的输入中比scanf 优秀,scanf 输入的时候,换行需要getchar()配合。
代码
#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
int dx[]={0,0,1,-1,0,0};
int dy[]={0,0,0,0,1,-1};
int dz[]={1,-1,0,0,0,0};
char a[35][35][35];
bool vis[35][35][35];
struct node{
int x,y,z;
int dis;
};
int main()
{
int l,r,c,sx,sy,sz,tz,tx,ty;
while(cin>>l>>r>>c) //3 4 5
{
if(l==0&&r==0&&c==0) return 0;
memset(vis,false,sizeof(vis));
memset(a,0,sizeof(a));
node p;
int cnt=0;
for(int i=0;i<l;i++) //ijk x y z
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
{
cin>>a[i][j][k];
//cout<<" "<<a[i][j][k];
cnt++;
if(a[i][j][k]=='S') {
p.x=i;p.y=j;p.z=k;p.dis=0;
}
else if(a[i][j][k]=='E'){
tx=i,ty=j,tz=k;
} //
}
}
}
//输入数据完毕
//printf("cnt:%d\n",cnt);
queue<node> q;
bool flag=false;
while(!q.empty()) q.pop();
q.push(p);
vis[p.x][p.y][p.z]=true;
while(!q.empty())
{
node now=q.front();
q.pop();
//cout<<"now:"<<now.x<<" "<<now.y<<" "<<now.z<<" "<<now.dis<<endl;
if(now.x==tx&&now.y==ty&&now.z==tz)
{
flag=true;
//printf("Escaped in %d minute(s)\n",now.dis);
printf("Escaped in %d minute(s).\n",now.dis);
break;
}
node next;
for(int i=0;i<6;i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
next.z=now.z+dz[i];
// printf("***%d %d %d\n",next.z,next.x,next.y);
if(next.x>=0&&next.x<l&&next.y>=0&&next.y<r&&next.z>=0&&next.z<c&&!vis[next.x][next.y][next.z]&&a[next.x][next.y][next.z]!='#'){//next 符合条件
next.dis=now.dis+1;
q.push(next);
// printf("%d %d %d dis:%d\n",next.z,next.x,next.y,next.dis);
vis[next.x][next.y][next.z]=true;
//cout<<"next:"<<next.x<<" "<<next.y<<" "<<next.z<<" "<<next.dis<<endl;
}
}
}
if(!flag){
printf("Trapped!\n");
}
}
return 0;
}
//输入数据
/*
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
*/