Panasonic Programming Contest 2021(AtCoder Beginner Contest 231)


整体情况

从上次的"交一次过一次"到这次的"乱交,过题数到4个就行",实际上让分数段上移了一个。

但是也要注意到这样的危险:如果是一个要求正确率而非过题数的比赛,就无了。

换句话讲,如果比赛时间长且难度低,就应该稳健A题。

如果比赛时间短且不一定写得完,就应该"疯狂"交题。


 细节问题

这次B题妄想用map甚至java做,耽误了时间。

解决方法:在考场上压根就不要考虑自己不常用的东西,得不偿失。


 A - Water Pressure

给定一个整数D,输出D/100。

题解:如题意。

#include
#include
using namespace std;
 
int main() {
	int val;
	cin >> val;
	double s = (double)val / 100;
	cout << s << endl;
	return 0;
}

 B - Election

给定N个字符串,求出现次数最多的字符串。

题解:sort一遍,直接获得答案。

#include
#include
#include
#include
using namespace std;
 
string s[200];
 
int main(){
	int n;
	scanf("%d",&n);
	
	int cnt=0;
	for(int i=1;i<=n;i++){
		cin>>s[++cnt];
	}
	
	sort(s+1,s+cnt+1);
	
	string ans=s[1];
	int maxx=1;
	
	string last=s[1];
	int tmpCnt=1;
	
	for(int i=2;i<=cnt;i++){
		if(last==s[i]){
			tmpCnt++;
			
			if(tmpCnt>maxx){
				ans=s[i];
				maxx=tmpCnt;
			}
			
		}else tmpCnt=1;
		
		last=s[i];
	}
	
	cout<


C - Counting 2

给出10^5个人的身高(1 -- 10^9),并进行10^5次询问。

每次询问高于指定身高的人数。

题解:一开始妄想使用线段树,耽误了时间(压根开不下)。

实际上,sort后直接二分即可。

#include
#include
#include
using namespace std;
const int MAXN=3e5;
int a[MAXN];
 
int main(){
	int n,q;
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	
	sort(a+1,a+n+1);
	
	for(int i=1;i<=q;i++){
		int val;
		scanf("%d",&val);
		int index=lower_bound(a+1,a+n+1,val)-a-1;
		cout<<(n-index)<


D - Neighbors

有N个人和M个条件,每个条件规定A和B必须相邻,没有被规定的人可以随便排,问是否有将N个人排成一行的办法。

题解:判断每个点相邻的点的数量后还需要判环(DFS)。

#include
#include
#include
using namespace std;
const int MAXN=5e5;
const int MAXM=5e5;
 
struct Edge{
	int from,to,nxt;
}e[MAXN];
int head[MAXN],cnt=0;
 
void addEdge(int u,int v){
	e[++cnt].from=u;
	e[cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
 
bool isOk(int index){
	
	int cnt=0;
	for(int i=head[index];i;i=e[i].nxt){
		cnt++;
	}
	
	return cnt<=2;
}
 
bool canTo(int from,int to){
	for(int i=head[from];i;i=e[i].nxt){
		if(to==e[i].to)return 1;
	}
	return 0;
}
 
bool vis[MAXN];
//判环 
bool dfs(int start,int from,int now,bool isFirst){
	vis[now]=1;
	for(int i=head[now];i;i=e[i].nxt){
		if(e[i].to==start&&(e[i].to!=from)&&(!isFirst)){
			return 1;
		}
		if(!vis[e[i].to]){
			return dfs(start,now,e[i].to,0);
		}
	}
	return 0;
}
 
int in[MAXN];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++){
		in[i]=0;
		head[i]=0;
	}
	
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		if(!canTo(a,b)){
			addEdge(a,b);
			addEdge(b,a);
			in[a]++;
			in[b]++;
		}
	}
	
	//判环 
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			if(dfs(i,0,i,1)){
				printf("No\n");
				return 0;
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		if(!isOk(i)){
			printf("No\n");
			return 0;
		}
	}
	printf("Yes\n");
	return 0;
}

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Bing Webmaster Portal Back