Problem B
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 307 Accepted Submission(s) : 63
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
2020年东京奥运会志愿者选拔,选拔原则择优录取,选拔委员会对所有报名的志愿者进行笔试,笔试分数达到面试分数线的志愿者方可进行面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数的所有选手。
Input
第一行,输入两个整数n,m(5<=n<=5000),3<=m<=n),中间空格隔开,其中n表示报名参见笔试的志愿者总数,m表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。
第二行到第n+1行,每行输入两个整数,中间用空格隔开,分别表示志愿者报名号k(1000<=k<=9999)和该志愿者的笔试成绩s(1<=s<=100)。数据保证志愿者的报名号各不相同。
测试有多个用例。
第二行到第n+1行,每行输入两个整数,中间用空格隔开,分别表示志愿者报名号k(1000<=k<=9999)和该志愿者的笔试成绩s(1<=s<=100)。数据保证志愿者的报名号各不相同。
测试有多个用例。
Output
第一行输出两个整数,用空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的志愿者实际人数。
第二行开始分别输出进入面试的志愿者的报名号和笔试成绩,中间用空格隔开,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
第二行开始分别输出进入面试的志愿者的报名号和笔试成绩,中间用空格隔开,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
Sample Input
6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88
Sample Output
88 5 1005 95 2390 95 1000 90 1001 88 3239 88
#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; struct A{ int k,s; }f[5010],q[5010]; bool cmp(A x,A y){ if(x.s==y.s) return x.k<y.k; return x.s>y.s; } bool cmp1(int x,int y) { return x>y; } int main() { int n,m,avg; int a[5010]; while(~scanf("%d %d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%d %d",&f[i].k,&a[i]); f[i].s=a[i];//a[]数组用来保存笔试成绩 } sort(a,a+n,cmp1);//对笔试成绩排序 sort(f,f+n,cmp);//对结构体排序 int l=(int)(m*1.5);//取整 int ans=0,ll=0; for(int i=0;i<n;i++) { if(f[i].s>=a[l-1])//a[l-1]就是面试的分数线,因为下标是从0开始的, //而名次是从1开始的,所以减1, { ans++;//ans就是面试成功的人数了 q[ll].k=f[i].k;//把面试成功的人数存在另一结构体数组里 q[ll++].s=f[i].s; } } printf("%d %d\n",a[l-1],ans); for(int i=0;i<ans;i++) { printf("%d %d\n",q[i].k,q[i].s); } } return 0; }