题目:Problem - 1822E - Codeforces (Unofficial mirror by Menci)
贪心的思路:
我们可以考虑贪心地进行操作,每次将数组中最大的数和除最大数外最大的数进行减1操作,直到所有数相等为止。这样的操作方式可以使得数组尽可能快地达到最终状态。
因此,我们只需要判断数组中的最大值与数组所有元素之和的关系即可:
如果最大值小于等于数组元素之和的一半,那么可以进行操作使得数组最终都为0。
否则,无论如何都无法将数组变为全0状态。
因为每次操作最多只会减少两个元素之和1,而最大值与数组之和的差值必然大于等于数组元素个数,所以无论如何都无法完成将数组变为全0状态的操作。
因此,满足最大值小于等于数组元素之和的一半是数组可以最终都变为0的必要条件。
剩下的数为:max(2*maxx-(sum),(sum)%2)
void solve()
{
int n;
string s;
cin>>n>>s;
if(n&1)
{
cout<<-1<<endl;
}
else
{
map<int,int>h,k;
s=' '+s;
int cnt=0,flag=0;
for(int i=1;i<=n;i++)
{
h[s[i]]++;
if(h[s[i]]>n/2)flag++;
}
for(int i=1;i<=n/2;i++)
{
if(s[i]==s[n-i+1])k[s[i]]++,cnt++;
}
if(flag)
{
cout<<-1<<endl;
}
else if(cnt==0)
{
cout<<0<<endl;
}
else
{
for(auto i:k)
{
if(i.y*2>cnt)
{
cout<<i.y<<endl;
return ;
}
}
cout<<(cnt+1)/2<<endl;
}
}
}