C - Bacteriahttps://vjudge.csgrandeur.cn/problem/Gym-101911C问题简述:给定n个细胞以及每个细胞的大小,相同的细胞能进行融合,如果能融合到只剩1个细胞则输出需要额外增加多少细胞才能把全部融合到只剩一个细胞,如果不能则输出-1.
思路:每次取出最小和次小的元素x1,x2,如果x1=x2,删掉这两个元素,把x1+x2入队列,如果x1不等于x2,把最小的元素删除,再把x1*2加到队列里面(相当于加了一个元素x1,把两个x1合并),直到队列只剩一个元素(说明可能实现把所有元素归到一个上),如果队列里元素一直大于一个,说明无法把所有元素归到一个上。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
while(~scanf("%lld",&n))
{
priority_queue<ll,vector<ll>,greater<ll>>q;
ll x;
for(int i=0;i<n;i++)
{
scanf("%lld",&x);
q.push(x);
}
ll cnt=0;
ll x1,x2;
ll f=0;
if(n==1)
{
printf("0\n");
}
else
{
while(!q.empty())
{
x1=q.top();
q.pop();
if(!q.empty())
{
x2=q.top();
if(x1==x2)
{
x1=x1+x2;
q.pop();
q.push(x1);
}
else
{
x1=2*x1;
q.push(x1);
cnt++;
}
}
if(cnt>3e5)//加了这么多还没有合成一个说明不能合成一个了
{
f=1;
break;
}
}
if(f==0)printf("%lld\n",cnt);
else
printf("-1\n");
}
}
}