题目
传送门:
暴风城
代码
由于听小伙伴说这道题的四组考生开成数组做会超时,我在结构体内加了个参数 rank 来分组。
一开始懒得找地址,写了四个cmp函数,四个sort(起止地址是整个数组),产生了意想不到的错误,整个顺序都乱了。
于是一个sort,开始苦逼地找地址,sort函数比较怪异,第二个参数要写尾地址+1。而且str+i <==> &str[ i ] 。于是下一个sort开头参数等于上一个的第二个参数。
掌握规律就简单了,不过还是觉得复杂,待优化。
放出我的代码(duan cai):
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
typedef struct student{
int moral;
int talent;
int sum;
int irank;
int num;
}Student;
Student stu[100005];
int cmp_rank(Student x,Student y)
{
return x.irank < y.irank;
}
int cmp(Student x,Student y)
{
x.sum = x.moral+x.talent;
y.sum = y.moral+y.talent;
if(x.sum==y.sum){
if(x.moral==y.moral)return x.num < y.num;
else return x.moral > y.moral;
}
else return x.sum > y.sum;
}
int main()
{
// printf("%p %p",stu+3,&stu[3]);
// system("pause");
int n,l,h,i;
int cnt_0=0,cnt_1=0,cnt_2=0,cnt_3=0,cnt_4=0;
scanf("%d%d%d",&n,&l,&h);
for(i=0;i<n;i++){
scanf("%d",&stu[i].num);
scanf("%d %d",&stu[i].moral,&stu[i].talent);
if(stu[i].moral<l||stu[i].talent<l){stu[i].irank=0;cnt_0++;}//pass 0
else if(stu[i].moral>=h&&stu[i].talent>=h){stu[i].irank=1;cnt_1++;}//rank 1
else if(stu[i].moral>=h&&stu[i].talent<h){stu[i].irank=2;cnt_2++;}//rank 2
else if(stu[i].moral<h&&stu[i].talent<h&&(stu[i].moral>=stu[i].talent)){stu[i].irank=3;cnt_3++;}//rank 3
else {stu[i].irank=4;cnt_4++;}//rank 4
}
sort(stu,stu+n,cmp_rank);
sort(&stu[cnt_0],&stu[cnt_0]+cnt_1,cmp);
sort(&stu[cnt_0]+cnt_1,&stu[cnt_0]+cnt_1+cnt_2,cmp);
sort(&stu[cnt_0]+cnt_1+cnt_2,&stu[cnt_0]+cnt_1+cnt_2+cnt_3,cmp);
sort(&stu[cnt_0]+cnt_1+cnt_2+cnt_3,&stu[cnt_0]+cnt_1+cnt_2+cnt_3+cnt_4,cmp);
printf("%d\n",n-cnt_0);
for(i=0;i<n;i++){
if(stu[i].irank){
printf("%8d %d %d\n",stu[i].num,stu[i].moral,stu[i].talent);
}
}
return 0;
}
我知道很吊。。先这样吧
坑