HIT2023112282 @ 2023-10-17 20:22:53
#include<bits/stdc++.h>
using namespace std;
struct Stu
{
string name;
int chi,math,eng;
int sum;
}a[1010];
bool cmp(Stu x,Stu y)
{
return x.sum>=y.sum;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].name>>a[i].chi>>a[i].math>>a[i].eng;
a[i].sum=a[i].chi+a[i].eng+a[i].math;
}
sort(a+1,a+1+n,cmp);
cout<<a[1].name<<" "<<a[1].chi<<" "<<a[1].math<<" "<<a[1].eng;
return 0;
}
by Pitiless_boy @ 2023-10-17 20:25:18
@ HIT2023112282如果有多个总分相同的学生,输出靠前的那位
。
by Pitiless_boy @ 2023-10-17 20:25:51
@HIT2023112282
by Pitiless_boy @ 2023-10-17 20:29:06
所以要改成这样:
#include<bits/stdc++.h>
using namespace std;
struct Stu {
string name;
int chi, math, eng;
int sum, id;//id 存编号
} a[1010];
bool cmp(Stu x, Stu y) {
return (x.sum > y.sum) || ((x.sum == y.sum) && (x.id < y.id));// 总分多的排前面,总分一样编号小的排前面。
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].name >> a[i].chi >> a[i].math >> a[i].eng;
a[i].sum = a[i].chi + a[i].eng + a[i].math;
a[i].id = i;
}
sort(a + 1, a + 1 + n, cmp);
cout << a[1].name << " " << a[1].chi << " " << a[1].math << " " << a[1].eng;
return 0;
}
by Kazeno_Akina @ 2023-10-17 20:30:00
我记得cmp是要求绝对顺序的,也就是不能a>b且b>a。
所以要改成>号罢?不然就是乱七八糟了。
by Wanderer_01 @ 2023-10-17 20:31:49
@DoraYaoxy
这个是没关系的。
by Kazeno_Akina @ 2023-10-17 20:33:06
@Wanderer_01 分班考试有个同学因为这么写最小生成树就挂来着,我记得是。
by Argvchs @ 2023-10-17 20:35:49
@Wanderer_01 但是确实是有关系的
https://zh.cppreference.com/w/cpp/algorithm/sort
https://zh.cppreference.com/w/cpp/named_req/Compare
类型要求
- Compare 必须符合比较 (Compare) 的要求。
建立具有下列性质的严格弱序关系
对于所有 a,
comp(a,a)==false
若
comp(a,b)==true
则comp(b,a)==false
若
comp(a,b)==true
且comp(b,c)==true
则comp(a,c)==true
by Wanderer_01 @ 2023-10-17 20:41:46
(x.sum > y.sum) || ((x.sum == y.sum) && (x.id < y.id))
这应该是两种不同的关键字吧。
by Pitiless_boy @ 2023-10-17 20:45:01
@Wanderer_01 双关排序啊?没问题吧
by HIT2023112282 @ 2023-10-18 20:50:33
@Pitiless_boy 用了id加上排序确实可以过了