
整体情况
从上次的"交一次过一次"到这次的"乱交,过题数到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;
}