打卡信奥刷题(794)用C++信奥P10223[普及组/提高] [COCI 2023/2024 #3] Eurokod

P10223 [COCI 2023/2024 #3] Eurokod

题目背景

译自 COCI 2023/2024 Contest #3 T1「Eurokod

题目描述

Eurokod,全球美丽与高可读性代码竞赛,今年第一次举行!

共有 n n n 名参赛者参加了竞赛,他们被依次编号为 1 ∼ n 1\sim n 1n。每名参赛者已经编写了一份代码。

他们的代码将由一组计算机科学家进行评估。这组计算机科学家分为组长与其他成员,组长将用一种方法给出评分,其他成员则用另一种方法给出评分。

组长评分:

组长按照他的想法,将代码按照美丽程度从大到小排序。最美丽的代码将获得 n n n 分,其他代码依次比上一名少一分。

其他成员评分:

每名其他成员将投票选出自己认为最美丽的代码。在所有其他成员投票后,所有代码按照投票人数从高到低排序。得票数最多的代码将获得 n n n 分,其他代码依次比上一名少一分。

总分:

一份代码的总分由组长评分与其他成员评分加和得到。

你的任务是按照得分降序输出代码的编号。如果两份代码得分相同,其他成员评分高者列前。

输入格式

第一行包含一个整数 n n n 1 ≤ n ≤ 50 1 \le n \le 50 1n50),表示参赛者的数目。

第二行包含 n n n 个整数 a i a_i ai 1 ≤ a i ≤ n 1 \le a_i \le n 1ain),第 i i i 个整数表示组长评为第 i i i 名代码的编号。按照美丽程度从高到低给出。保证 1 ∼ n 1\sim n 1n 恰好出现一次。

第三行包含 n n n 个整数 b i b_i bi 0 ≤ b i ≤ 200 0 \le b_i \le 200 0bi200),第 i i i 个整数表示第 i i i 份代码收获的其他成员票数。保证没有两份代码获得了同样的票数。

输出格式

输出 n n n 行,按照分数降序输出代码编号。

每一行的输出应当符合 [rank]. Kod[label] ([number of points]) 的格式。其中,[rank] 表示代码的排名,[label] 是用含前导零的两位十位数表示的代码编号,[number of points] 是代码获得的总分。

例如, 3 3 3 号代码以 12 12 12 分总分获得第一名,那么你应该在第一行输出 1. Kod03 (12)

输入输出样例 #1

输入 #1

3
1 2 3
50 10 20

输出 #1

1. Kod01 (6)
2. Kod03 (3)
3. Kod02 (3)

输入输出样例 #2

输入 #2

5
5 2 4 1 3
4 5 2 1 3

输出 #2

1. Kod02 (9)
2. Kod05 (8)
3. Kod01 (6)
4. Kod04 (4)
5. Kod03 (3)

输入输出样例 #3

输入 #3

7
6 3 2 1 5 4 7
200 56 11 0 13 105 12

输出 #3

1. Kod06 (13)
2. Kod01 (11)
3. Kod02 (10)
4. Kod03 (8)
5. Kod05 (7)
6. Kod07 (4)
7. Kod04 (3)

说明/提示

样例解释 1

Kod03 和 Kod02 得分相同,但 Kod03 从其他成员处获得了更高的分数,所以 Kod03 排名列前。

样例解释 2

组长给予 Kod05 最高的排名,它因此获得 n = 5 n=5 n=5 分。

子任务

SubtaskPointsConstraints
117对于每一份代码,其他成员投的票数与其他成员评分在数值上相同。同时,没有两份代码总分相同。
219没有两份代码总分相同。
314无特殊限制。

C++实现

#include<bits/stdc++.h>
using namespace std;
long long n;
struct nn{
long long ii,zu,qi;
}a[1000001];
struct nnn{
long long fen,qii,id;
}k[1000001];
bool cp(nn x,nn y){
return x.qi>y.qi;
}
bool cmp(nnn x,nnn y){
if(x.fen==y.fen) return x.qii>y.qii;
else return x.fen>y.fen;
}
int main(){
scanf(“%lld”,&n);
for(long long i=1;i<=n;i++){
scanf(“%lld”,&a[i].zu);
k[a[i].zu].fen+=n-i+1;
}
for(long long i=1;i<=n;i++){
scanf(“%lld”,&a[i].qi);
k[i].qii=a[i].qi;
k[i].id=i;
a[i].ii=i;
}
sort(a+1,a+1+n,cp);
for(long long i=1;i<=n;i++){
k[a[i].ii].fen+=n-i+1;
}
sort(k+1,k+1+n,cmp);
for(long long i=1;i<=n;i++){
if(k[i].id<10) cout<<i<<“. Kod0”<<k[i].id<<" (“<<k[i].fen<<”)“<<endl;
else cout<<i<<”. Kod"<<k[i].id<<" (“<<k[i].fen<<”)"<<endl;
}
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值