A1055

本题思路很清晰,但需注意时间复杂度的把握,自己写的代码一个测试点超时:
一开始想着通过结构体数组赋值的方式,可降低结构体数组重排列的次数,但是数组不可直接赋值。
数组除定义外不能整体操作
绝大部分使用数组名的情形,实际上使用的都是数组名隐式转化的指向数组首元素的指针,包括最常见的[]操作符
跟结构体不结构体一点关系都没有

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值