新手求助。6,7,8测试点过不了

P1093 [NOIP2007 普及组] 奖学金

liuxiang007 @ 2021-12-07 12:40:33

#include <cstdio> 
#include <algorithm>
#include <iostream>
int a[301],b[301],c[301],d[301],f[301];
void swap(int &a,int &b){
    int temp = a;
    a = b;
    b = temp;
}
using namespace std;
int main()
{
    int n,i,j,count=1,temp=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        f[i] = count++;
        d[i] = a[i]+b[i]+c[i];
    }
    sort(a,a+n);
    for(i=1;i<n;i++){
        for(j=i+1;j<=n;j++){
            if(d[j]>d[i]){
                swap(d[j],d[i]);
                swap(f[j],f[i]);
            }
            else if(d[j]==d[i]&&f[j]<f[i]){
                swap(d[j],d[i]);
                swap(f[j],f[i]);
            }
        }
    }
    for(i=1;i<=n;i++){
        cout<<f[i]<<" "<<d[i]<<endl;
        temp++;
        if(temp==5)  break;
    }
    return 0;
}

by DAI33DAI @ 2021-12-07 12:46:37

你的代码没有按照语文成绩排序,总分相等时直接去比较学号了~


by DAI33DAI @ 2021-12-07 12:49:10

可以考虑删除掉无用的 sort(a,a+n);

然后排序的逻辑可以修改为:

if(d[j]>d[i]){
    swap(a[j],a[i]);
    swap(d[j],d[i]);
    swap(f[j],f[i]);
}
else if(d[j]==d[i]&&a[j]>a[i]){
    swap(a[j],a[i]);
    swap(d[j],d[i]);
    swap(f[j],f[i]);
}
else if(d[j]==d[i]&&a[j]==a[i]&&f[j]<f[i]){
    swap(a[j],a[i]);
    swap(d[j],d[i]);
    swap(f[j],f[i]);
}

建议使用结构体会方便很多~


by liuxiang007 @ 2021-12-07 16:23:17

谢谢大佬,AC了。是一开始想用结构体做但一直处理不好细节,然后不记得删了sort。目前对结构体排序还不是很熟练。


|