原题概括:初始时,你有一个野兽,攻击力为1,现在给你一条有n个操作的路径,你将进行n个操作,要求野兽的平均攻击力最大,如果未通过这条路径,则输出-1,通过了就输出一个分数,sum(攻击力总和)/cnt(宠物数量),要求是最简分数
操作 1:你获得一个额外的攻击力为1的野兽。
操作 -1:选择两只野兽进行仪式,将失去一个野兽,而它的攻击力可以加给另一个。
操作 0:你可以选择操作1 或者 操作 -1。
思路分析:要想平均攻击力最大,那么每次遇到零时,如果cnt(野兽数量大于2)可以就进行操作 -1,但是如果后面出现操作 -1,而此时你的野兽数量并不能进行合并(数量为1时),那就无法通过路径。所以,我们可以记录操作为 0 的次数,当我们无法进行合并时,就让为0的操作反悔(因为我们为0时,就进行操作 -1,现在反悔进行操作 1)
代码解释:sum为攻击力总和,cnt为野兽数量,ch为操作0的次数
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N];
int main(){
int t;
cin>>t;
while(t--){
int n,x,f=0;
cin>>n;
int sum=1,cnt=1,ch=0;
for(int i=1;i<=n;i++){
cin>>x;
if(x==1){
sum++;cnt++; //进行操作1
}
else if(x==-1){
if(cnt>1) cnt--; //如果野兽数量大于1,就合并
else if(ch>=1){
ch--; //否则,如果操作为0的次数大于1,就进行反悔
sum++;cnt++; //数量加一,攻击力加一
}
else f=1;
}
else{
if(cnt>1){ //操作为0
ch++;
cnt--; //如果野兽数量大于1,就合并
}
else{
cnt++;sum++; //否则就数量加一,攻击力加一
}
}
}
if(f) cout<<-1<<endl;
else{
cout<<sum/__gcd(sum,cnt)<<" "<<cnt/__gcd(sum,cnt)<<endl;
}
}
}