尝试在输出格式上动手脚的30分失败品.jpg
查看原帖
尝试在输出格式上动手脚的30分失败品.jpg
1473093
projectmoonfan楼主2025/1/23 10:17

是这样,蒟蒻在看完题解区后有所想法,想在输出格式上通过”第二层循环“中的判断,按递增的id顺序,找到对应的排名并输出 样例过了,但提交只有三十分,求大佬斧正(哭哭) 代码如下:

#include<bits/stdc++.h>
using namespace std;
struct stu{
	int id;
	int ran;//排名
	int ch;
	int ma;
	int en;
	int sum;//总成绩
};
bool cmp(stu &a,stu &b){
	if(a.sum!=b.sum){
		return a.sum>b.sum;
	}
	else if((a.ch+a.ma)!=(b.ch+b.ma)){
		return a.ch+a.ma>b.ch+b.ma;
	}
	else if(max(a.ch,a.ma)!=max(b.ch,b.ma)){
		return max(a.ch,a.ma)>max(b.ch,b.ma);
	}
	else{
		return a.id<b.id;
	}
}
bool cmp1(stu &a,stu &b){//直接把cmp复制过来了,但稍有改动
	if(a.sum!=b.sum){
		return a.sum>b.sum;
	}
	else if((a.ch+a.ma)!=(b.ch+b.ma)){
		return a.ch+a.ma>b.ch+b.ma;
	}
	else if(max(a.ch,a.ma)!=max(b.ch,b.ma)){
		return max(a.ch,a.ma)>max(b.ch,b.ma);
	}
	else{
		a.ran=b.ran;//再排一遍同时找到重复排名,可能有点多余
		return a.id<b.id;
	}
}
int main()
{
	int n;
	int tip;
	stu a[20000];
    scanf("%d",&n);//防TL,下同
    for(int i=1;i<=n;i++){
    	scanf("%d%d%d",&a[i].ch,&a[i].ma,&a[i].en);
    	a[i].sum=a[i].ch+a[i].ma+a[i].en;
    	a[i].id=i;
	}
	sort(a+1,a+1+n,cmp);//排序
	for(int i=1;i<=n;i++){a[i].ran=i;}
	sort(a+1,a+1+n,cmp1);//找排名
	for(int i=1;i<=n;i++){//列排名
		for(int j=1;j<=n;j++){
			if(a[j].id==i){//找对应id的排名,所谓“第二层循环”
				printf("%d\n",a[j].ran);
			}
		}
	}
	//cin>>tip;
	//f(tip==1){
	//	return main();
	//}
	//else{
	//	return 0;
	//}
  //重置程序,方便样例排查
	return 0;
}
2025/1/23 10:17
加载中...