liuxiang007 @ 2021-12-07 12:40:33
#include <cstdio>
#include <algorithm>
#include <iostream>
int a[301],b[301],c[301],d[301],f[301];
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
using namespace std;
int main()
{
int n,i,j,count=1,temp=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
f[i] = count++;
d[i] = a[i]+b[i]+c[i];
}
sort(a,a+n);
for(i=1;i<n;i++){
for(j=i+1;j<=n;j++){
if(d[j]>d[i]){
swap(d[j],d[i]);
swap(f[j],f[i]);
}
else if(d[j]==d[i]&&f[j]<f[i]){
swap(d[j],d[i]);
swap(f[j],f[i]);
}
}
}
for(i=1;i<=n;i++){
cout<<f[i]<<" "<<d[i]<<endl;
temp++;
if(temp==5) break;
}
return 0;
}
by DAI33DAI @ 2021-12-07 12:46:37
你的代码没有按照语文成绩排序,总分相等时直接去比较学号了~
by DAI33DAI @ 2021-12-07 12:49:10
可以考虑删除掉无用的 sort(a,a+n);
然后排序的逻辑可以修改为:
if(d[j]>d[i]){
swap(a[j],a[i]);
swap(d[j],d[i]);
swap(f[j],f[i]);
}
else if(d[j]==d[i]&&a[j]>a[i]){
swap(a[j],a[i]);
swap(d[j],d[i]);
swap(f[j],f[i]);
}
else if(d[j]==d[i]&&a[j]==a[i]&&f[j]<f[i]){
swap(a[j],a[i]);
swap(d[j],d[i]);
swap(f[j],f[i]);
}
建议使用结构体会方便很多~
by liuxiang007 @ 2021-12-07 16:23:17
谢谢大佬,AC了。是一开始想用结构体做但一直处理不好细节,然后不记得删了sort。目前对结构体排序还不是很熟练。