[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;
}

posted @ 2025-10-10 16:26  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源