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 好的 懂了!感谢!