分数线划定【题目连接】node
这道题也不是什么难题,思路一带而过吧:ios
SOLUTION:c++
First.输入n,m,计算m*1.5的值,接着输入编号和成绩,而后个人作法是在输入编号成绩以后,开一个101大小的数组来记录某个分数段的人数(由于分数是0~100因此才敢这么干qwq大了就怂了)。数组
Second.使用最简单好用的sort进行排序,按照成绩从高到低排,若是成绩相同,编号小的在前面。ide
Third.进行分数线划定,这里喜欢用while(不会用for写这个的说),首先咱们先选择恰为计划录取人数的150%(下取整)的人数,而后要注意的是每选择一我的就把这我的所表明的分数的d数组--;spa
而后计算到第m我的时,若是第m我的所对应的d数组不为0,那么说明还有相同分数的没有被选上,所以用当前记录到的cnt+=d[p[cnt].s];code
Last.输出(这个没必要多说)blog
自我感受今天考场上写的代码比洛谷上交的思路要好(至少思路清晰)排序
附代码:get
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<cmath> using namespace std; int n,m,cnt; int d[101]; struct node { int k,s; }p[5010]; bool cmp(node x,node y){ if(x.s==y.s) return x.k<y.k; return x.s>y.s; } int main(){ scanf("%d %d",&n,&m); m*=1.5; for(int i=1;i<=n;i++) scanf("%d %d",&p[i].k,&p[i].s),d[p[i].s]++; sort(p+1,p+n+1,cmp); while(cnt<=m){ if(cnt==m) break; cnt++; d[p[cnt].s]--; } if(d[p[cnt].s]!=0) cnt+=d[p[cnt].s]; cout<<p[cnt].s<<" "<<cnt<<endl; for(int i=1;i<=cnt;i++) cout<<p[i].k<<" "<<p[i].s<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; int n,m,cnt[101],ans,sor,r; struct node{ int k,s; }p[5010]; bool cmp(node x,node y){ if(x.s==y.s) return x.k<y.k; return x.s>y.s; } int main(){ scanf("%d %d",&n,&m); int jh=m*1.5; for(int i=1;i<=n;i++) scanf("%d %d",&p[i].k,&p[i].s),cnt[p[i].s]++; sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++){ if(ans+1>jh) break; if(p[i-1].s==p[i].s) r++; if(p[i-1].s!=p[i].s) r=1; ans++; sor=p[i].s; } if(cnt[sor]!=r) ans+=(cnt[sor]-r); cout<<sor<<" "<<ans<<endl; for(int i=1;i<=ans;i++) cout<<p[i].k<<" "<<p[i].s<<endl; }
end-