80分求助TT

P1093 [NOIP2007 普及组] 奖学金

Moyyer_suiy @ 2021-06-02 18:44:58

80求助


#include<iostream>
#include<algorithm>
using namespace std;
struct stu{
    int num,yw,sx,yy,zf;
}a[302];
int cmp(stu a,stu b)
{
    return (a.zf>b.zf)||(a.zf==b.zf&&a.yw>b.yw)||(a.zf==b.zf&&a.yw&&b.yw&&a.num<b.num);
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].yw>>a[i].sx>>a[i].yy;
        a[i].num=i+1;
        a[i].zf=a[i].yw+a[i].sx+a[i].yy; 
    }
    sort(a,a+n,cmp);
    for(int i=0;i<5;i++)
        cout<<a[i].num<<" "<<a[i].zf<<endl;
    return 0;
}

by Leo2020 @ 2021-06-02 18:50:41

本蒟蒻的垃圾代码

#include<bits/stdc++.h>
using namespace std;
struct s{
    int c,m,e,all,num;
}; 
int main(){
    int n,max=1,j=0; 
    s a[301];
    cin >> n;
    for(int i=1;i<=n;++i) {
        cin >> a[i].c >> a[i].m >> a[i].e;
        a[i].all=a[i].c+a[i].m+a[i].e;
        a[i].num=i;
    }
    while(j!=5) {
        for(int i=2;i<=n;++i) {
            if(a[i].all>a[max].all )  max=i;
            if(a[i].all==a[max].all && a[i].c>a[max].c) max=i;
            if (a[i].all==a[max].all && a[i].c==a[max].c && a[i].num<a[max].num) max=i;
        }
        cout << a[max].num << " " << a[max].all << endl;
        a[max].all=-1;
        max=1;
        j++;
    }
    return 0;
}

by ZBAA_MKC @ 2021-06-02 18:57:17

@茉小窈儿 把sort换成stable_sort就能AC


by Moyyer_suiy @ 2021-06-02 19:03:53

@Leo2020 谢谢!我看看


by Moyyer_suiy @ 2021-06-02 19:10:03

@mkc20230729 好的谢谢!!方便的话能问问一下为什么这么做么


by ZBAA_MKC @ 2021-06-02 19:49:16

@茉小窈儿 因为sort内部使用的快速排序是不稳定排序算法,排序过程中数值相同的变量前后顺序会交换。这一弊端在一般的数组排序中显现不出来,但在结构体这一问题显得格外突出,例如:

2 abc
2 cba

假设题目要求先按数字排序,数字相同按输入顺序输出。因为sort是不稳定的,在排序过程中可能会导致二者交换顺序,从而得到错误答案:

2 cba
2 abc

所以我们要使用一种稳定的排序算法。 但手写归并排序/冒泡排序未免太复杂,我们可以直接调用algorithm库中的stable_sort排序函数,其内部使用的是一种稳定的排序算法(具体是什么我不太清楚),可以避免上述错误的发生


by Moyyer_suiy @ 2021-06-03 18:24:35

@mkc20230729 好的 懂了!感谢!


|