NCST 2018-2019秋季学期17级个人排位赛(一)
A:PUBG
Time Limit:2.000 Sec Memory Limit:128 MiB
Description
喜欢ACM的大一新生FYX同学沉迷吃鸡,这一天,他又开始了一局刺激的吃鸡游戏,经过一番搜寻,一级套的FYX同学准备驱车前往安全区。
FYX深知地图中一定会埋伏许多LYB,FYX希望你能够帮他找到一条到达安全区的安全路线,不要遇到LYB。
Input
第一行为一个整数\(n\),代表地图的大小\((n\times n)\);
接下来的\(n\)行中,每行包含\(n\)个整数\(a\),\(a=0\)表示当前位置可以安全通行,\(a=1\)表示当前位置有LYB。\(a=3\)代表FYX的当前位置,\(a=4\)代表安全区。
规定:\(1 < n \leqslant 100\)。
Output
输出到达安全路线的最短步数。
Sample Input
5
1 1 0 1 1
3 0 1 1 1
0 0 0 1 1
1 0 1 4 1
0 0 0 0 0
Sample Output
7
PZ's Solution
1.BFS的模板题,不过这里实际上有一个很有意思的结论:
2.设一个图\(G\)的所有的边的边权为\(1\),那么从某点开始的单源最短路可以直接通过BFS求出;
- TAG:BFS广度优先搜索
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int>qx,qy;
int n,ex,ey,sx,sy,a[105][105],dis[105][105];
bool vis[105][105];
int fx[]={0,0,1,-1};
int fy[]={1,-1,0,0};
void bfs(){
qx.push(sx); qy.push(sy); vis[sx][sy]=1;
while(!qx.empty()){
int x=qx.front(),y=qy.front();
qx.pop(); qy.pop();
for(int i=0;i<4;++i){
int nx=x+fx[i],ny=y+fy[i];
if(nx<1||n<nx||ny<1||n<ny||vis[nx][ny]||a[nx][ny]==1) continue;
dis[nx][ny]=dis[x][y]+1;
if(nx==ex&&ny==ey) break;
vis[nx][ny]=1;
qx.push(nx); qy.push(ny);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%d",&a[i][j]);
if(a[i][j]==3){ sx=i,sy=j; }
if(a[i][j]==4){ ex=i,ey=j; }
}
bfs();
printf("%d",dis[ex][ey]);
return 0;
}
B:fzc的爱好
Time Limit:2.000 Sec Memory Limit:128 MiB
Description
喜欢ACM的大一新生fzc同学来到了大学之后发现自己宿舍的同学各不相同;
有的同学喜欢玩游戏;有的同学喜欢打篮球;有的喜欢和班级的男同学谈理想;有的同学喜欢和班级的女同学谈人生。
fzc也有自己独特的爱好,他喜欢判断一个仅由\(a、b、c、d、e\)组成的字符串中字符出现最多的次数。
Input
一个由 \(5\) 个英文字符 \(abcde\) 组成的字符串(\(1 \leqslant\) 字符串长度\(\leqslant 50\))。
Output
字符串中字符出现最多的次数。
Sample Input
aaabbc
Sample Output
3
PZ's Solution
1.本题题意为输出 出现最多的 字符 的 出现次数;
2.因为只会出现\(a、b、c、d、e\)这几种字符,直接记录并排序即可;
- TAG:字符串
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int vis[10];
int main(){
cin>>s;
for(int i=0;i<s.size();++i)
vis[s[i]-'a']++;
sort(vis,vis+5);
printf("%d",vis[4]);
return 0;
}
C:Math Function
Time Limit:2.000 Sec Memory Limit:128 MiB
Description
喜欢ACM的大一新生FYX同学遇到了一道高数题,已知底数\(n\),要求算出\(a=n^π\)的结果(\(π\)取\(3.1415926\))。
FYX觉得这很简单,但是题目又要求结果保留小数点后\(x\)位,这样他就不会了。学长学姐能帮帮他嘛?
Input
第一行一个整数\(M\),表示测试实例的个数;
后面\(M\)行输入数据,每行包含两个正整数\(n\)、\(x\),分别表示底数与要保留的小数点后的位数。
规定:\(1 \leqslant M \leqslant 50, 1 \leqslant n \leqslant 100 , 1 \leqslant x \leqslant 5\)。
Output
对于每组输入数据,分别输出每个测试实例的结果\(a\),每个输出占一行。
Sample Input
3
1 3
7 5
9 1
Sample Output
1.000
451.80783
995.0
PZ's Solution
1.这里可以直接使用cmath
库里的pow()
函数,因为其本身即返回double
,且要求保留的小数位数最多仅为\(5\)位;
2.对给出的\(x\)进行分类判断,然后使用scanf()
输出即可;
- TAG:数学
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define Pi 3.1415926
int M,n,x;
int main(){
scanf("%d",&M);
while(M--){
scanf("%d %d",&n,&x);
if(x==1) printf("%.1lf\n",pow(n,3.1415926));
if(x==2) printf("%.2lf\n",pow(n,3.1415926));
if(x==3) printf("%.3lf\n",pow(n,3.1415926));
if(x==4) printf("%.4lf\n",pow(n,3.1415926));
if(x==5) printf("%.5lf\n",pow(n,3.1415926));
}
return 0;
}
D:学姐的神秘卡片
Time Limit:2.000 Sec Memory Limit:128 MiB
Description
喜欢ACM的大一新生FYX今天很无聊,他发现自己的桌子上有学姐留下的四张神秘卡片:
每张卡片上都有一个数字(数字可能相同),他发现用这四张卡片可以排成很多不同的4位数。
FYX希望可以按从小到大的顺序输出这些4位数,你可以和他一起完成这个任务嘛?
Input
四个整数,分别表示四张卡片上的数字(\(1 \leqslant\) 数字 \(\leqslant 9\))。
Output
对每组卡片排列的结果按升序输出全排列,每两个输出结果之间用空格隔开。
Sample Input
1 1 2 3
Sample Output
1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211
PZ's Solution
1.简单的深搜模板,不过值得注意的是,由于数字可能相同,所以拼凑出来的数也可能相同;
2.而这些拼凑出来相同的数,应视为只有一个数(简单来说,就是输出不能重复);
- TAG:DFS深度优先搜索
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[5];
bool vis[5],f[10000];
void dfs(int x,int res){
if(x==5){
if(!f[res]) f[res]=1,printf("%d ",res);
return;
}
for(int i=1;i<=4;++i)
if(!vis[i]){
vis[i]=1;
dfs(x+1,res*10+a[i]);
vis[i]=0;
}
}
int main(){
for(int i=1;i<=4;++i) scanf("%d",&a[i]);
sort(a+1,a+1+4);
dfs(1,0);
return 0;
}
E:跳蚤市场
Time Limit:2.000 Sec Memory Limit:128 MiB
Description
喜欢ACM的大一新生FYX同学来到了大学一年一度的跳蚤市场,FYX这个月已经没有生活费了,于是他拿着两本《C语言程序设计教程》,准备把它们卖了。
跳蚤市场里有很多认识FYX的学姐,每位学姐见到FYX都愿意送给他一些程序设计书。
FYX没想到的是,有许多同样喜欢ACM的新生,看到自己手中的程序设计书都特别眼红。FYX菩萨心肠,慈悲为怀,愿意把自己所有的书(包括学姐送的书)卖给其他的新生同学。
这一路上,FYX一共遇到学姐们\(5\)次,每一次学姐们都会送给FYX与他当前时刻手中同样数量的书;一共遇到新生们\(10\)次,每一次都会卖一本书。已知FYX最后一次遇见一位新生,正好把手中的书卖完。
可以把遇到学姐记为\(1\),遇到新生记为\(2\)。则\(212112212212222\),就是合理的次序,\(121222221212122\)也是合理的次序。像这样的次序一共有多少种呢?
Input
没有输入
Output
输出一个整数,为次序的总数。
PZ's Solution
1.一道提交答案题,不过题面意思很明确;
2.考虑使用搜索,要注意几个条件:
1).不论是遇到学姐还是遇到新生,手里必须要剩下书,不然学姐给不了你书,你也卖不给新生书;
2).注意 FYX最后依此遇见一位新生,正好把手中的书卖完,这是累加答案的依据;
- TAG:DFS深度优先搜索;递归
PZ.cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans;
void dfs(int X,int Y,int Book,int C){
if(X<0||Y<0) return;
if(C==1&&X==0&&Y==0&&Book==0){
++ans;
return;
}
if(Book<=0) return;
dfs(X-1,Y,Book*2,0);
dfs(X,Y-1,Book-1,1);
}
int main(){
dfs(5,10,2,-1);
printf("%d",ans);
return 0;
}