80分求助啊啊啊啊各位大哥们卡了好久了!

P1093 [NOIP2007 普及组] 奖学金

dog_of_mayi_is_me @ 2022-06-02 16:59:42


#include<bits/stdc++.h>
using namespace std;
struct student{
    int H,C,M,E,Z;//学号,语,数,英,总分 
};
student a[305];
int main()
{
    int n,num;
    cin>>n;
    for(int i=1;i<=n;i++)
        {
            cin>>a[i].C;cin>>a[i].M;cin>>a[i].E;
            a[i].Z=a[i].C+a[i].M+a[i].E;
            a[i].H=i;
        }   //输入
    for(int i=1;i<=n;i++)
    {
        //每次循环完结果为将:最大移到最后(即n-i个),其余往前移一个
        for(int j=1;j<=n-i;j++)
        {   
            if(a[j].Z<a[j+1].Z)
            {
                num=a[j+1].C;
                a[j+1].C=a[j].C;
                a[j].C=num;
                num=a[j+1].Z;
                a[j+1].Z=a[j].Z;
                a[j].Z=num;
                num=a[j+1].H;
                a[j+1].H=a[j].H;
                a[j].H=num;
            }
            if(a[j].Z==a[j+1].Z)
            {
                if(a[j].C<a[j+1].C)
                {
                    num=a[j+1].H;
                    a[j+1].H=a[j].H;
                    a[j].H=num;
                }
                if(a[j].C==a[j+1].C)
                {
                    if(a[j].H>a[j+1].H)
                    {
                    num=a[j+1].H;
                    a[j+1].H=a[j].H;
                    a[j].H=num;
                    }
                }   
            }   
        }
    }
        //每次循环完结果为将:最大移到最后(即n-i个),其余往前移一个
    for(int i=1;i<=5;i++)
        cout<<a[i].H<<" "<<a[i].Z<<endl;
}

by Ayaka_Li @ 2022-06-02 17:50:37

我是无异常,不谢


#include<bits/stdc++.h>
using namespace std;
struct stu
{
    int sum,c,m,e,id;
//sum成绩总和
}a[99999];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i].c>>a[i].m>>a[i].e;//输入成绩
        a[i].sum=a[i].c+a[i].m+a[i].e;//算出成绩和
        a[i].id=i;//记录编号
    }
    for(int i=1;i<=n;i++) 
        for(int j=i+1;j<=n;j++) 
        if(a[i].sum<a[j].sum || (a[i].sum==a[j].sum&&a[i].c<a[j].c)) {//比较
            swap(a[i].sum,a[j].sum);//交换总分
            swap(a[i].c,a[j].c);//交换语文
            swap(a[i].id,a[j].id);//交换编号
        }
        cout<<a[1].id<<" "<<a[1].sum;//输出第一个    
        for(int i=2;i<=5;i++) cout<<endl<<a[i].id<<" "<<a[i].sum;//因为只要前五名并且已经输出第一名所以是2~5;
    return 0;
}

by ZMN_LQQ @ 2022-06-02 18:10:36

你在比较语文和学号时,没有全部交换


by _ChongYun_ @ 2022-10-23 22:35:37

@dog_of_mayi_is_me 你或许可以用sort?

#include<bits/stdc++.h>
using namespace std;
long long n;
struct node{
    int id;
    int sum;
    int yuwen;
    int shuxue;
    int yingyu;
}a[114514];
bool cmp(node a,node b){
    if(a.sum>b.sum) {
        return true;
    }else if(a.sum<b.sum){
        return false;
    }else{
        if(a.yuwen>b.yuwen){
            return true;
        }else if(a.yuwen<b.yuwen){
            return false;
        }else{
            if(a.id>b.id){
                return false;
            }else{
                return true;
            } 
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].yuwen;
        cin>>a[i].shuxue;
        cin>>a[i].yingyu;
        a[i].id=i;
        a[i].sum=a[i].yuwen+a[i].shuxue+a[i].yingyu;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=5;i++){
        printf("%d %d\n",a[i].id,a[i].sum);
    }
} 

|