首页 新闻 会员 周边 捐助

做题发现结果最后用不同的排序方法,答案正确率不同,想不出原因,求解答

0
[待解决问题]

“天梯赛”的竞赛题目一共有 15 道,分为 3 个梯级:

基础级设 8 道题,其中 5 分、10 分、15 分、20 分的题各 2 道,满分为 100 分;题目编号相应为L1-X,X取1,2,3,4,5,6,7,8,分别表示基础级的8道题,如L1-1表示基础级的第1题。

进阶级设 4 道题,每道题 25 分,满分为 100 分;题目编号相应为L2-X,X取1,2,3,4,分别表示进阶级的4道题,如L2-2表示进阶级的第2题。

登顶级设 3 道题,每道题 30 分,满分为 90 分。题目编号相应为L3-X,X取1,2,3,分别表示登顶级的3道题,如L3-2表示登顶级的第2题。

注:若对以上表述仍有不理解或者不清楚的,则请参考本套考题的题号与分值。

在我们校赛中,积分规则和正式天梯赛积分规则有些许不同,校赛的积分规则简化后如下:

参赛者须独立按照严格的输入输出要求提交每一题的解题程序。程序须经过若干测试用例的测试,每个测试用例分配一定分数。每题的得分为通过的测试用例得分之和;整场比赛得分为各题得分之和。程序可反复提交,取最高分,提交错误不扣分。
参赛者的个人总分由每题得分和先锋奖励组成。只有当该队员的基础题总分超过 60 分时,其进阶部分的题目分数(包括奖励)才被判为对其个人有效;当其进
阶题总分超过 25 分时,其登顶部分的题目分数(包括奖励)才被判为对其个人有效。
当一支参赛团队的基础题总分超过 300 分时,该队进阶部分的题目分数才被判为对团队有效;只有当其进阶题总分超过 125 分时,该队登顶部分的题目分数才被判为对团队有效。
校赛中每个参赛团队由5名参赛者组成。
注:基础题是默认有效的。对个人/团队无效得分的部分视为0分。

团队的基础题总分为所有队员在基础题的得分总和;

团队的进阶题总分为所有队员在进阶题的得分总和;

团队的登顶题总分为所有队员在登顶题的得分总和。

当队员在进阶题或登顶题的得分对个人来说是无效时,但是这部分仍然计入团队进阶题和登顶题得分,只有当团队基础题得分/进阶题得分达到了进阶条件,团队的进阶题得分/登顶题得分才能被判定为对团队有效。

在竞赛的过程中你和你的队友都如此沉迷,以至于你们都忘记看实时榜单,比赛结束后你们只能通过提交记录计算你们团队每个人的得分以及团队总得分。具有团队精神的你想要亲自编写程序来解决这个问题。

天梯赛是善良的,同一道题你可以多次提交,该题最终得分为多次提交的最高分(参考样例1)。

若有些题没有提交记录,即该题记做0分。

同样因为一股神秘力量(可能来自参赛团队本身 只有自己团队的提交记录),本题不考虑先锋奖励。

输入格式:
输入第一行给出一个非负整数N(0<=N<200),表示提交记录的数量。

接下来N行,每行给出一条提交记录的详细情况,其格式为:队员编号 题目编号 分数。你们队员的编号依次为1,2,3,4,5。

题目保证所有的提交记录只有你们团队的记录,不会出现其他队伍的记录;同时,同一道题可能有多次提交。

输出格式:
一共输出6行。

第1行输出团队总得分。

接下来5行输出团队5个人每个人的成绩,按总分由高到低的顺序。若总分相同,则优先输出编号较小者。

输入样例1:
5
1 L1-1 5
1 L1-1 3
1 L1-1 4
1 L1-1 2
1 L1-1 1
输出样例1:
5
1 5
2 0
3 0
4 0
5 0
输入样例2:
22
1 L1-8 20
1 L1-7 20
1 L1-6 15
1 L1-5 15
2 L1-8 20
2 L1-7 20
2 L1-6 15
2 L1-5 15
3 L1-8 20
3 L1-6 15
3 L1-5 15
4 L1-8 20
4 L1-7 20
4 L1-6 15
4 L1-5 15
4 L1-4 10
4 L1-3 10
1 L1-4 10
1 L1-3 10
1 L1-2 5
5 L2-1 25
5 L2-2 25

输出样例2:
355
1 95
4 90
2 70
3 50
5 0
样例解释2:
5号队员虽然进阶题得到50分,但是他基础题得分为0,所以,对于5号队员个人来说,他的最后总得分为0;对于整个团队来说,团队的基础题部分得分为305,达到了进阶条件;5号选手在进阶部分的得分可以计入团队的进阶部分得分,所以团队最后的总得分为355。接下来请继续你的快乐作答!
问题:在最后排序的地方,用注释部分排序方法最后就只是部分正确

include<bits/stdc++.h>

using namespace std;
struct inf {
int id,s[9],m[5],h[4],sum_s,sum_m,sum_h,sum;
}ans[6];
void chushihua(struct inf* a){//初始化结构体
a->id=a->sum=a->sum_h=a->sum_m=a->sum_s=0;
int i;
for(i=0;i<9;i++){
a->s[i]=0;
}
for(i=0;i<5;i++){
a->m[i]=0;
}
for(i=0;i<4;i++){
a->h[i]=0;
}

}
void gen(struct inf* temp,int h,int l,int g){//跟新分数
int i=temp->id;
if(h1){
if(g>ans[i].s[l]){
ans[i].s[l]=g;
}
}else if(h
2){
if(g>ans[i].m[l]){
ans[i].m[l]=g;
}
}else if(h==3){
if(g>ans[i].h[l]){
ans[i].h[l]=g;
}
}
}
void jisuan(struct inf* ans){//计算个人各部分总和
if(ans->sum_s<60){
ans->sum_m=0;
}
if(ans->sum_m<25){
ans->sum_h=0;
}
ans->sum=ans->sum_h+ans->sum_m+ans->sum_s;
}
struct t{//团队分数
int sum_s,sum_m,sum_h,sum;
};
int main(){
int n;
int i;
cin>>n;
for(i=1;i<6;i++){
chushihua(&ans[i]);
}
for(i=0;i<n;i++){//读入答题信息
struct inf temp;
chushihua(&temp);
int h,l,g;
string a;
cin>>temp.id>>a>>g;
h=a[1]-'0';
l=a[3]-'0';
gen(&temp,h,l,g);
}
struct t team;
team.sum=team.sum_h=team.sum_m=team.sum_s=0;
for(i=1;i<6;i++){//计算各部分得分
int j;
for(j=1;j<9;j++){
ans[i].sum_s+=ans[i].s[j];
}
for(j=1;j<5;j++){
ans[i].sum_m+=ans[i].m[j];
}
for(j=1;j<4;j++){
ans[i].sum_h+=ans[i].h[j];
}
team.sum_h+=ans[i].sum_h;
team.sum_m+=ans[i].sum_m;
team.sum_s+=ans[i].sum_s;
}
if(team.sum_s<300){
team.sum_m=0;
}
if(team.sum_m<125){
team.sum_h=0;
}
team.sum=team.sum_s+team.sum_m+team.sum_h;//团队总得分
cout<<team.sum<<endl;
int j;
for(i=1;i<6;i++){
ans[i].id=i;//统计个人得分和记录个人id
jisuan(&ans[i]);
}
for(i=1;i<6;i++){
for(j=i+1;j<6;j++){//排序
if(ans[i].sum<ans[j].sum){
struct inf t=ans[j];
ans[j]=ans[i];
ans[i]=t;
}
}
}
/for(i=1;i<6;i++){
for(j=1;j<6-1-i;j++){//排序
if(ans[j].sum<ans[j+1].sum){
struct inf t=ans[j+1];
ans[j+1]=ans[j];
ans[j]=t;
}
}
}
/

for(i=1;i<6;i++){
    cout<<ans[i].id<<' '<<ans[i].sum<<endl;
}


return 0;

}

GGBond*的主页 GGBond* | 菜鸟二级 | 园豆:204
提问于:2024-04-02 22:35
< >
分享
所有回答(1)
0

在你的代码中,排序部分出现了两种不同的排序方法,它们可能产生不同结果的原因在于具体实现和排序逻辑的细微差异。这里我将详细解释一下问题所在,并提供一个正确的解决方案。

代码问题分析
你使用了两个不同的排序循环,一个是冒泡排序,一个是选择排序。但在这两种排序方法中,比较和交换的逻辑都可能存在问题。特别是在排序中,你可能没有正确考虑到相同分数情况下的编号排序。

解决方案
我们需要按照以下排序规则来对每个队员的成绩进行排序:

总分数由高到低排序。
如果总分数相同,按编号升序排序。
修改后的完整代码
cpp
Copy code

include <bits/stdc++.h>

using namespace std;

struct inf {
int id, sum_s, sum_m, sum_h, sum;
int s[9], m[5], h[4];
};

void chushihua(struct inf& a) { // 初始化结构体
a.sum = a.sum_h = a.sum_m = a.sum_s = 0;
fill(begin(a.s), end(a.s), 0);
fill(begin(a.m), end(a.m), 0);
fill(begin(a.h), end(a.h), 0);
}

void gen(struct inf& temp, int h, int l, int g) { // 更新分数
if (h == 1) {
if (g > temp.s[l]) {
temp.s[l] = g;
}
} else if (h == 2) {
if (g > temp.m[l]) {
temp.m[l] = g;
}
} else if (h == 3) {
if (g > temp.h[l]) {
temp.h[l] = g;
}
}
}

void jisuan(struct inf& ans) { // 计算个人各部分总和
if (ans.sum_s < 60) {
ans.sum_m = 0;
}
if (ans.sum_m < 25) {
ans.sum_h = 0;
}
ans.sum = ans.sum_h + ans.sum_m + ans.sum_s;
}

struct t { // 团队分数
int sum_s, sum_m, sum_h, sum;
};

int main() {
int n;
cin >> n;

vector<inf> ans(6);
for (int i = 1; i < 6; i++) {
    ans[i].id = i;
    chushihua(ans[i]);
}

for (int i = 0; i < n; i++) { // 读入答题信息
    int id, g;
    string a;
    cin >> id >> a >> g;
    int h = a[1] - '0';
    int l = a[3] - '0';
    gen(ans[id], h, l, g);
}

t team = {0, 0, 0, 0};
for (int i = 1; i < 6; i++) { // 计算各部分得分
    for (int j = 1; j < 9; j++) {
        ans[i].sum_s += ans[i].s[j];
    }
    for (int j = 1; j < 5; j++) {
        ans[i].sum_m += ans[i].m[j];
    }
    for (int j = 1; j < 4; j++) {
        ans[i].sum_h += ans[i].h[j];
    }
    team.sum_h += ans[i].sum_h;
    team.sum_m += ans[i].sum_m;
    team.sum_s += ans[i].sum_s;
}

if (team.sum_s < 300) {
    team.sum_m = 0;
}
if (team.sum_m < 125) {
    team.sum_h = 0;
}
team.sum = team.sum_s + team.sum_m + team.sum_h; // 团队总得分
cout << team.sum << endl;

for (int i = 1; i < 6; i++) {
    jisuan(ans[i]);
}

// 排序,先按总分降序,如果总分相同则按编号升序
sort(ans.begin() + 1, ans.end(), [](const inf& a, const inf& b) {
    if (a.sum == b.sum) return a.id < b.id;
    return a.sum > b.sum;
});

for (int i = 1; i < 6; i++) {
    cout << ans[i].id << ' ' << ans[i].sum << endl;
}

return 0;

}
关键修改点
初始化和更新函数:保持不变,但确保分数更新逻辑正确。
计算总分:在计算个人总分时,考虑无效得分情况。
排序部分:使用 std::sort 并通过自定义比较函数,确保按总分降序、编号升序排序。
这样修改后,可以确保正确地计算并排序每个队员的成绩和团队总分。

Technologyforgood | 园豆:7541 (大侠五级) | 2024-05-29 17:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册