题解:P13797 [SWERC 2023] Programming-trampoline-athlon!

· · 题解

思路

题面很长,但其实就是个模拟。

首先每个队这么多数据肯定要用结构体存的,这点不用多说。

我们边输入边计算每队得分,得分是编程得分和蹦床得分的和。编程得分为解决的问题数乘以 10。蹦床得分为去掉最高和最低分后的四个中间分的总和。

然后就可以排序了。按得分降序排序,得分相同就按输入顺序升序排序。另外还要检查比其得分高的队伍数量是否不超过 2

代码

#include<bits/stdc++.h>
using namespace std;
int n,p,e[6],sum,c[100001];
string s;
struct z{
    int s,id;
    string c;
}t[100001];
bool cmp(z a,z b){
    if(a.s!=b.s)return a.s>b.s;
    return a.id<b.id;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s>>p;
        for(int j=0;j<6;j++){
            cin>>e[j];
        }
        sort(e,e+6);
        t[i].s=p*10+e[1]+e[2]+e[3]+e[4];
        t[i].id=i;
        t[i].c=s;
    }
    sort(t+1,t+n+1,cmp);
    c[1]=0;
    for(int i=2;i<=n;i++){
        if(t[i].s<t[i-1].s){
            c[i]=i-1;
        }
        else{
            c[i]=c[i-1];
        } 
    }
    for(int i=1;i<=n;i++){
        if(c[i]<=2){
            cout<<t[i].c<<" "<<t[i].s<<endl;
        }
        else break;
    }
    return 0;
}