1062 Talent and Virtue (25 分)

博客围绕一道排序题展开,用四个数组模拟四类人。在cmp函数中,名字按升序排列时,使用'return strcmp(x.name,y.name)<0;'可通过,省去'<0'则会出现段错误和超时,博主无法给出解释并展示了通过代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道排序题
看题目戳这
我用四个数组模拟四个类别的人

只有一个小细节

我的cmp函数里的名字按升序排列时这样写就过了
return strcmp(x.name,y.name)<0;

而return strcmp(x.name,y.name);
省去<0则会发生段错误和超时

很奇怪

我给不出解释

以下是通过代码

#include<bits/stdc++.h>
using namespace std;
int n,l,h;
struct node{
	char name[15];
	int v,t;
}p1[100005],p2[100005],p3[100005],p4[100005];
bool cmp(node x,node y){
	int a=x.t+x.v,b=y.t+y.v;
	if(a!=b){
		return a>b;
	}else {
		if(x.v!=y.v){
			return x.v>y.v;
		}else {
			return strcmp(x.name,y.name)<0;//return strcmp(x.name,y.name)为啥不可以???;
		}

	}
}
int main(){
	int t,v,cnt1=0,cnt2=0,cnt3=0,cnt4=0;
	char name[15];
	scanf("%d%d%d",&n,&l,&h);
	getchar();
	for(int i=0;i<n;i++){
		scanf("%s%d%d",name,&v,&t);
		if(t>=h&&v>=h){
			strcpy(p1[cnt1].name,name);
			p1[cnt1].t=t;
			p1[cnt1].v=v;
			cnt1++;
		}else if(l<=t&&t<h&&v>=h){
			strcpy(p2[cnt2].name,name);
			p2[cnt2].t=t;
			p2[cnt2].v=v;
			cnt2++;
		}else if(v>=t&&t>=l&&v>=l){
			strcpy(p3[cnt3].name,name);
			p3[cnt3].t=t;
			p3[cnt3].v=v;
			cnt3++;
		}else if(v>=l&&t>=l){
			strcpy(p4[cnt4].name,name);
			p4[cnt4].t=t;
			p4[cnt4].v=v;
			cnt4++;
		}
	}
	sort(p1,p1+cnt1,cmp);
	sort(p2,p2+cnt2,cmp);
	sort(p3,p3+cnt3,cmp);
	sort(p4,p4+cnt4,cmp);
	printf("%d\n",cnt1+cnt2+cnt3+cnt4);
	for(int i=0;i<cnt1;i++){
		printf("%s %d %d\n",p1[i].name,p1[i].v,p1[i].t);
	}
	for(int i=0;i<cnt2;i++){
		printf("%s %d %d\n",p2[i].name,p2[i].v,p2[i].t);
	}
	for(int i=0;i<cnt3;i++){
		printf("%s %d %d\n",p3[i].name,p3[i].v,p3[i].t);
	}
	for(int i=0;i<cnt4;i++){
		printf("%s %d %d\n",p4[i].name,p4[i].v,p4[i].t);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值