P10223题解
liujinhan12 · · 题解
根据题目可知
-
组长评分:第
i 个整数表示组长评为第i 名代码的编号 -
其他成员评分: 第
i 个整数表示其他队员投给编号为i 的人的票数
也就是说组长评分的编号无序,而其他成员评分的编号有序。
于是有了第一次排序,把组长评分的编号从小到大排好。
然而其他成员评分的票数是无序的。
所以第二次排序,把其他成员评分的票数从大到小排好,就可以得到该评分
最后再把总评分排序就好了。
代码展示
#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;
}