问题标题: 酷町堂:4572 年龄排序

0
0
已解决
陈曦
陈曦
资深天翼
资深天翼

题目传送门🚪

我写的 4572   年龄排序 的 80 分代码如下:

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int n;
struct px{
    string name;
    int x,y,z;
}a[15000];
bool cmp(px o,px p){
    if(o.x!=p.x){
        return o.x>p.x;
    }
    else if(o.y!=p.y){
        return o.y>p.y;
    }
    else{
        return o.z>p.z;
    }
} 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].x>>a[i].y>>a[i].z;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<a[i].name<<endl;
    }
    return 0;
}

请找错


0
已采纳
李显晨
李显晨
中级启示者
中级启示者

你这排序错了,他说年龄相同的按照输入的顺序先后来排序。

所以输入这么写:

for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].x>>a[i].y>>a[i].z;
        a[i].pos=i;
    }

所以排序这么写:

bool cmp(stu x,stu y){
    if(x.x!=y.x) return x.x>y.x;
    if(x.y!=y.y) return x.y>y.y; 
    if(x.z!=y.z) return x.z>y.z;
    return x.pos<y.pos;
}

最后在a数组里加一个pos,即可AC

0
汪恺恒
汪恺恒
中级启示者
中级启示者

和5520一样

按照输入的顺序,先输入的先输出

cmp改成

 
    if(o.x!=p.x) return o.x<p.x;
    if(o.y!=p.y) return o.y<p.y;
    if(o.z!=p.z) return o.z<p.z;
    return o.cnt<p.cnt;

结构体加一条

int cnt;

输入时


    for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].x>>a[i].y>>a[i].z;
        a[i].cnt=i;
    }

之后都一样

望采纳!

我要回答