NCST 2018-2019秋季学期17级个人排位赛(一)

参考题解Reference Solution



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;
}
posted @ 2021-02-03 15:35  PotremZ  阅读(90)  评论(0编辑  收藏  举报