本题思路很清晰,但需注意时间复杂度的把握,自己写的代码一个测试点超时:
一开始想着通过结构体数组赋值的方式,可降低结构体数组重排列的次数,但是数组不可直接赋值。
数组除定义外不能整体操作
绝大部分使用数组名的情形,实际上使用的都是数组名隐式转化的指向数组首元素的指针,包括最常见的[]操作符
跟结构体不结构体一点关系都没有
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
char name[9];
int age;
int worth;
}richer[100001];
bool cmp1(node a,node b){
return a.age<b.age;
}
bool cmp2(node a,node b){
int t=strcmp(a.name,b.name);
if(a.worth!=b.worth)return a.worth>b.worth;
else if(a.age!=b.age)return a.age<b.age;
else return t<0;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,p,amin,amax;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%s %d %d",richer[i].name,&richer[i].age,&richer[i].worth);
}
sort(richer,richer+n,cmp1);
for(int i=1;i<=k;i++){
scanf("%d %d %d",&p,&amin,&amax);
int begin=0,end=n-1;
while(richer[begin].age<amin)begin++;
while(richer[end].age>amax)end--;
printf("Case #%d:\n",i);
if(begin>end)printf("None\n");
else{
sort(richer+begin,richer+end+1,cmp2); //sort函数排序范围没注意,这个问题很大,一定要记住
int limit=min(end,begin+p-1);
for(int j=begin;j<=limit;j++){
printf("%s %d %d\n",richer[j].name,richer[j].age,richer[j].worth);
}
sort(richer+begin,richer+end+1,cmp1);
}
}
return 0;
}
算法笔记,作预处理:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int agenum[201]={0};
struct node{
char name[9];
int age;
int worth;
}richer[100001],extract[100001];
bool cmp(node a,node b){
int t=strcmp(a.name,b.name);
if(a.worth!=b.worth)return a.worth>b.worth;
else if(a.age!=b.age)return a.age<b.age;
else return t<0;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,p,amin,amax,index=0;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++){
scanf("%s %d %d",richer[i].name,&richer[i].age,&richer[i].worth);
}
sort(richer,richer+n,cmp);
for(int i=0;i<n;i++){ //作预处理:提取出每个年龄富有度前100的人,按序存储到副本结构体数组中
if(agenum[richer[i].age]<100){
agenum[richer[i].age]++;
extract[index]=richer[i];
index++;
}
}
for(int i=1;i<=k;i++){
printf("Case #%d:\n",i);
scanf("%d %d %d",&p,&amin,&amax);
int sum=0;
for(int j=0;j<index&&sum<p;j++){
if(extract[j].age>=amin&&extract[j].age<=amax){
printf("%s %d %d\n",extract[j].name,extract[j].age,extract[j].worth);
sum++;
}
}
if(sum==0)printf("None\n");
}
return 0;
}