P10223题解

· · 题解

根据题目可知

也就是说组长评分的编号无序,而其他成员评分的编号有序。

于是有了第一次排序,把组长评分的编号从小到大排好。

然而其他成员评分的票数是无序的。

所以第二次排序,把其他成员评分的票数从大到小排好,就可以得到该评分 n-i+1

最后再把总评分排序就好了。

代码展示

#include<bits/stdc++.h> 
using namespace std;
long long n;
struct node{
    long long bh,zz,qt,hh;
}a[200000]; 
bool cmp1(node x,node y)
{
    return x.bh<y.bh;
}
bool cmp2(node x,node y)
{
    return x.qt>y.qt;
}
bool cmp3(node x,node y)
{
    if(x.hh+x.zz==y.hh+y.zz)//如果评分相同则从其他成员给的票数来决定谁在前 
    return x.qt>y.qt;
    return x.hh+x.zz>y.hh+y.zz;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)//编号 
    cin>>a[i].bh;
    for(int i=1;i<=n;i++)//组长评分 
    a[i].zz=n-i+1;  
    sort(a+1,a+1+n,cmp1);//第一次排序 
    for(int i=1;i<=n;i++)//其他成员票数 
    cin>>a[i].qt;
    sort(a+1,a+1+n,cmp2);//第二次排序 
    for(int i=1;i<=n;i++)//其他成员评分 
    a[i].hh=n-i+1;
    sort(a+1,a+1+n,cmp3);//第三次排序 
    for(int i=1;i<=n;i++)
    {
        cout<<i<<". Kod";
        if(a[i].bh>=10)
        {

            cout<<a[i].bh<<" ("<<a[i].hh+a[i].zz<<")"<<endl;
        }

        else 
        {
            cout<<0<<a[i].bh<<" ("<<a[i].hh+a[i].zz<<")"<<endl;
        }
    }

    return 0;
}