整体情况

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

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

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

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


 细节问题

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

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


 A - Water Pressure

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

题解:如题意。

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

 B - Election

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

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

#include<map>
#include<iostream>
#include<string>
#include<algorithm>
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<<ans<<endl;
	
	return 0;
}

C - Counting 2

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

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

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

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

#include<cstdio>
#include<iostream>
#include<algorithm>
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)<<endl;
	}
	
	return 0;
}

D - Neighbors

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

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

#include<cstdio>
#include<iostream>
#include<algorithm>
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;
}