题解 P1068 【分数线划定】
由于涉及到排序和对应序号
那就定义一个结构体
结合STL模板中的sort日常沉迷sort
提示:
虽然我也是蒟弱
sort是快速排序函数,有两个或三个参数,
两个参数适用于平常的数字类型,即形sort(a+1,a+n+1);其中a是数组名;
而三个参数更多适用于自己定义的结构体,使用时形如sort(a+1,a+n+1,cmp);cmp是自己定义的bool型函数,用于判断;
大体思路如下:
1.定义一个结构体,令成绩具有**两种属性**,一是**学号**,二是**分数**;
2.编辑一个cmp;用于判断,且优先级为成绩优先,其次学号;
3.进入主函数;读入n,m。定义一个cj类型的数组aa;并且读入学号和分数;
4.排序!!!使用sort一步到位(sort大法好)
5.然后计算分数线(注意一定要多读几遍题,不要像我一样理解错题意)
6.遍历一遍所有数据,定义一个计数器,累加及格人数;
7.由于sort已经令数据有序了,就直接输出吧,反正人数已经求出来了2333
#include<bits/stdc++.h> using namespace std; struct cj { int xh; int sum; }; cj aa[20000]; bool cmp (const cj &a,const cj &b){ if(a.sum>b.sum) return 1;//注意不要等于 if(a.sum<b.sum) return 0; if(a.xh>b.xh) return 0; if(a.xh<b.xh) return 1; } int main(){ int m; int n; cin>>n>>m; int a,b; double m1=m; for(int i=1;i<=n;i++){ cin>>a>>b; aa[i].sum=b; aa[i].xh=a; } sort(aa+1,aa+n+1,cmp); int p=floor(m1*1.5); int mm=aa[p].sum; cout<<mm<<" "; int cnt=0; for(int i=1;i<=n;i++){ if(aa[i].sum>=mm) cnt++; } cout<<cnt<<endl; for(int i=1;i<=cnt;i++){ cout<<aa[i].xh<<" "<<aa[i].sum<<endl; } return 0; }
“胡须如草芥疯长,悲欢不过梦一场”