P10223 [COCI 2023/2024 #3] Eurokod
题目背景
译自 COCI 2023/2024 Contest #3 T1「Eurokod」
题目描述
Eurokod,全球美丽与高可读性代码竞赛,今年第一次举行!
共有 n n n 名参赛者参加了竞赛,他们被依次编号为 1 ∼ n 1\sim n 1∼n。每名参赛者已经编写了一份代码。
他们的代码将由一组计算机科学家进行评估。这组计算机科学家分为组长与其他成员,组长将用一种方法给出评分,其他成员则用另一种方法给出评分。
组长评分:
组长按照他的想法,将代码按照美丽程度从大到小排序。最美丽的代码将获得 n n n 分,其他代码依次比上一名少一分。
其他成员评分:
每名其他成员将投票选出自己认为最美丽的代码。在所有其他成员投票后,所有代码按照投票人数从高到低排序。得票数最多的代码将获得 n n n 分,其他代码依次比上一名少一分。
总分:
一份代码的总分由组长评分与其他成员评分加和得到。
你的任务是按照得分降序输出代码的编号。如果两份代码得分相同,其他成员评分高者列前。
输入格式
第一行包含一个整数 n n n( 1 ≤ n ≤ 50 1 \le n \le 50 1≤n≤50),表示参赛者的数目。
第二行包含 n n n 个整数 a i a_i ai( 1 ≤ a i ≤ n 1 \le a_i \le n 1≤ai≤n),第 i i i 个整数表示组长评为第 i i i 名代码的编号。按照美丽程度从高到低给出。保证 1 ∼ n 1\sim n 1∼n 恰好出现一次。
第三行包含 n n n 个整数 b i b_i bi( 0 ≤ b i ≤ 200 0 \le b_i \le 200 0≤bi≤200),第 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 分。
子任务
| Subtask | Points | Constraints |
|---|---|---|
| 1 | 17 | 对于每一份代码,其他成员投的票数与其他成员评分在数值上相同。同时,没有两份代码总分相同。 |
| 2 | 19 | 没有两份代码总分相同。 |
| 3 | 14 | 无特殊限制。 |
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
972

被折叠的 条评论
为什么被折叠?



