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