算法笔记里的注意点二写错了:cin,cout导致运行超时。 其实不然,我就用了cin,cout来处理,运行也不见超时; 我觉得超时的关键点主要在于算法笔记中直接对结构体进行排序处理,因为频繁地挪动结构体是很耗费时间的; 这点其实也并不是我说的,陈越的数据结构mooc排序章节里有讲到。 处理方法:转为对结构体序号按一定规则进行排序。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100001;
struct person{
string ID_Number;
int Virtue_Grade,Talent_Grade,total,flag;
}P[maxn];
int corP[maxn];
int N,L,H;
int cnt;
bool cmp(int a,int b){
person A=P[a],B=P[b];
if(A.flag!=B.flag)
return A.flag>B.flag;
else{
if(A.total!=B.total) return A.total>B.total;
else{
if(A.Virtue_Grade!=B.Virtue_Grade)
return A.Virtue_Grade>B.Virtue_Grade;
else {
return A.ID_Number<B.ID_Number;
}
}
}
}
int main(void){
cin >> N>>L>>H;
string id;
int VG,TG;
for(int i=0;i<N;i++){
corP[i]=i;
}
for(int i=0;i<N;i++){
cin >> id >> VG >> TG;
if(!(VG>=L && TG>=L)) continue;
P[cnt].ID_Number=id;
P[cnt].Virtue_Grade=VG;
P[cnt].Talent_Grade=TG;
P[cnt].total=VG+TG;
if(VG>=H && TG>=H){
P[cnt].flag=3;
}else if(VG>=H && TG<H){
P[cnt].flag=2;
}else if(VG<H && TG<H && VG>=TG){
P[cnt].flag=1;
}else{
P[cnt].flag=0;
}
cnt++;
}
sort(corP,corP+cnt,cmp);
cout << cnt <<endl;
for(int i=0;i<cnt;i++){
cout << P[corP[i]].ID_Number << " ";
cout << P[corP[i]].Virtue_Grade << " "<< P[corP[i]].Talent_Grade;
cout << endl;
}
return 0;
}
|