记录下,第一遍string有个case超时,然后我把每次遍历的代码改成基于年龄设置200个桶,这样就可以在年龄段间遍历,这样确实可以过掉原来超时的那个case,但是另一个本来能过的case居然超时了。。。从最后全过的时间对比来看,我猜想大概是后面超时那个case的输出比较集中在worth值高的那部分里,而用桶来遍历,反而更耗时间。
最后,第一遍没过还是因为string比较慢,这其实跟我第一次猜测的一样,只不过我先试了用桶排序。
char数组比较用strcmp(),这个记一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n,k;
struct People{
char name[9];
int age, worth;
bool operator < (const People &a) const{
if(worth != a.worth)
return worth > a.worth;
else if(age != a.age)
return age < a.age;
else
return strcmp(name,a.name) < 0;
}
};
vector<People> list;
int main(){
scanf("%d%d",&n,&k);
string name;
int age, worth;
for(int i = 0; i < n; ++i){
People tmp;
scanf("%s%d%d",&tmp.name,&tmp.age,&tmp.worth);
list.push_back(tmp);
}
sort(list.begin(),list.end());
int top, low, high, cnt;
for(int i = 1; i <= k; ++i){
printf("Case #%d:\n",i);
cnt = 0;
scanf("%d%d%d",&top,&low,&high);
for(int j = 0; j < list.size(); ++j){
if(cnt == top) break;
if(list[j].age >= low && list[j].age <= high){
++cnt;
printf("%s %d %d\n",list[j].name,list[j].age,list[j].worth);
}
}
if(cnt == 0)
printf("None\n");
}
return 0;
}