[ICPC 2022 Nanjing R] 邪恶铭刻题解
题目描述
你迷失在森林深处,陪伴你的只有你的白鼬。它的初始攻击力为 1,是你唯一的初始野兽。
一条小道从眼前伸向远方。小道上有 n 个事件标志,每个标志属于以下事件之一:
- 卡牌选择:一位森林的住民加入了你的队伍。你获得了一只额外的野兽,它的初始攻击力为 1。
- 神秘石头:你被迫进行一次牺牲。你选择队伍中的两只野兽进行仪式:一只野兽将永远消失,而它的攻击力将加给另一只野兽。若你无法执行仪式,你将无法继续前进。
- 分岔路:你可以决定进行一次卡牌选择或神秘石头。你不能决定什么都不做。
当你穿过崎岖的路面时,事件将依次触发。在所有事件完成后,你的野兽的平均攻击力最大能达到多少?
输入格式
有多组测试数据。第一行输入一个整数 T 表示测试数据组数,对于每组测试数据:
第一行输入一个整数 n(1≤n≤106)表示事件的数量。
第二行输入 n 个整数 a1,a2,⋯,an(−1≤ai≤1),其中 ai 表示第 i 个事件标志的类型:1 表示卡牌选择,−1 表示神秘石头,0 表示分岔路。
保证所有数据 n 之和不超过 106。
输出格式
每组数据输出一行。
如果无法完成所有事件,输出整数 −1。
否则可以证明答案是一个有理数 q′p′。输出两个整数 p 和 q,其中 qp 是 q′p′ 的最简分数表示。
称 qp 是 q′p′ 的最简分数表示,若 qp=q′p′ 且 p 和 q 的最大公约数为 1。
输入输出样例
输入 #1复制
6 7 1 1 1 -1 1 1 -1 4 1 0 -1 0 4 0 -1 -1 0 1 0 2 0 0 1 -1
输出 #1复制
3 2 3 1 -1 1 1 2 1 -1
说明/提示
对第一组样例数据解释如下:
事件111−111−1行动获得额外的野兽获得额外的野兽获得额外的野兽选择攻击力为 1 和 1 的野兽获得额外的野兽获得额外的野兽选择攻击力为 2 和 1 的野兽野兽{1,1}{1,1,1}{1,1,1,1}{2,1,1}{2,1,1,1}{2,1,1,1,1}{3,1,1,1}
对第二组样例数据解释如下:
事件10−10行动获得额外的野兽进行卡牌选择并获得额外的野兽选择攻击力为 1 和 1 的野兽进行神秘石头并选择攻击力为 2 和 1 的野兽野兽{1,1}{1,1,1}{2,1}{3}
平均攻击力为 13。
对第三组样例数据解释如下:
事件0−1−1行动进行卡牌选择并获得额外的野兽选择攻击力为 1 和 1 的野兽没有足够的野兽野兽{1,1}{2}失败
思路
带悔贪心即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,a[1000006],b1,b2,b3,p1,q1,fk,wd=0;
int main(){
cin>>t;
while(t--){
cin>>n;
b1=b2=b3=0;
wd=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0){
b1++;
}
else if(a[i]==1){
b2++;
}
else{
b3++;
}
if(b1+b2<=b3-1){
wd=1;
}
}
if(wd==1){
cout<<-1<<endl;
}
else{
p1=q1=1;
fk=1;
for(int i=1;i<=n;i++){
if(a[i]==1){
p1++;
q1++;
}
else if(a[i]==-1){
q1--;
}
else{
q1--;
}
if(q1==0){
q1++;
p1++;
q1++;
}
}
cout<<p1/__gcd(q1,p1)<<" "<<q1/__gcd(q1,p1)<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号