求助,为什么只有80分

P1093 [NOIP2007 普及组] 奖学金

phrym @ 2023-09-23 20:09:46

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;

struct student {
    int p;
    int ch;
    int ma;
    int en;
    int sum;
};
student s[301];
int n;
int compsum(const student& a, const student& b)
{
    return a.sum > b.sum;
}
int main(void) {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        s[i].p = i;
        cin >> s[i].ch >> s[i].ma >> s[i].en;
        s[i].sum = s[i].ch + s[i].ma + s[i].en;
    }
    sort(s + 1, s + n + 1, compsum);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            if ((s[i].sum == s[i + 1].sum) && (s[i].ch < s[i + 1].ch))  swap(s[i], s[i + 1]); break;
            if ((s[i].sum == s[i + 1].sum) && (s[i].ch == s[i + 1].ch) && (s[i].p < s[i + 1].p))  swap(s[i], s[i + 1]); break;
        }
    }
    for (int i = 1; i <= 5; i++) {
        cout << s[i].p << " " << s[i].sum << endl;
    }
    return 0;
}

by WangYinxiAlex @ 2023-09-29 10:01:17

为啥你的代码这么长???

#include<iostream>
using namespace std;
int a[301][5],sum[301];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i][1]>>a[i][2]>>a[i][3];
        a[i][4]=i;
    }
    for(int i=1;i<=n;i++){
        sum[i]=a[i][1]+a[i][2]+a[i][3];
    }//求出总分
    for(int i=1;i<=n;i++){
        for(int j=(i+1);j<=n;j++){
            if(sum[i]<sum[j]){
                swap(a[i][1],a[j][1]);
                swap(a[i][2],a[j][2]);
                swap(a[i][3],a[j][3]);
                swap(a[i][4],a[j][4]);
                swap(sum[i],sum[j]);
            }//判断大小
            if(sum[i]==sum[j]){
                if(a[i][1]<a[j][1]){
                    swap(a[i][1],a[j][1]);
                    swap(a[i][2],a[j][2]);
                    swap(a[i][3],a[j][3]);
                    swap(a[i][4],a[j][4]);
                    swap(sum[i],sum[j]);
                }
            }//判断相等的特殊情况
        }
    }
    for(int i=1;i<=5;i++){
        cout<<a[i][4]<<" "<<sum[i]<<endl;
    }//输出
    return 0;
} 

简单了事。


by Miracle1024 @ 2023-10-02 10:06:39

@潘寒

这道题可以不用手写排序。

可以在 cmp 函数里写好整体的比较代码。


by Miracle1024 @ 2023-10-02 10:30:46

找到问题所在了。

为了解释这个问题,首先写这样一段代码:

#include<iostream>
using namespace std;
int main(){
    int a;
    cin>>a;
    if(a%2==1)cout<<3;cout<<a<<endl;
    cout<<0<<endl;
    return 0;
}

按照预期,这段代码会在输入奇数时输出3和这个奇数,然后换行,输出 0

输入偶数时,则会直接输出 0

但是当我们输入 4,会得到这样的输出:

4
0

可以看到, 4 本身也被输出了。

这是因为虽然我们把 语句cout<<a<<endl; 放在 if 语句后面,但是在不加大括号的情况下,if 语句只会管紧接着的一条语句。也就是说,无论 if 的条件是否达成,cout<<a<<endl; 都会被运行。

同理,在你的代码里,第 31 行、第 32 行的 break 语句虽然在 if 后,但它们是 if 后的第二条语句,在没有大括号的情况下,无论 if 的条件是否达成,这两条语句都会被运行。

所以应该在第 31 行、第 32 行的 if 语句后加大括号


by Miracle1024 @ 2023-10-02 10:35:12

嗯,才发现刚刚的分析并没有从根本上解决问题。

@潘寒 可以给我讲讲你的代码思路吗,我没特别懂内层循环的意义


by phrym @ 2023-10-07 16:44:30

@WangYinxiAlex 用二维数组存储确实没想到(哭死)多数据我一直用的结构体和类存储的,谢谢了


by phrym @ 2023-10-07 16:52:56

@yee1024pi就是说用结构体存储每个同学的成绩,然后按总分进行排序,循环是为了找出总分相同的情况(那个j那层循环是我多打了(哭了))然后最后就是按要求排好序的了,然后再输出前五名(但我用那个数据测试是对的?)


by WangYinxiAlex @ 2023-10-14 08:20:18

@潘寒 不用谢,本蒟蒻若能帮到您真是太好了(大大大客套话


by WangYinxiAlex @ 2024-01-14 11:04:11

@phrym 等等,潘寒?《三体》里面的那个?


by phrym @ 2024-01-23 20:09:16

@WangYinxiAlex 大概率不是的


by wangqicheng1637 @ 2024-03-15 18:04:08

至于吗? 不就一个cmp一个struct,两个for吗?


|