题解:这道题其实只有两种情况:当其中数字数大于字符数时,在内部进行交换就行。当字符数大于数字数时,在整个字符串前加上数字使得最后数字数大于字符数,然后再进行前面的交换
。反省:这道题一开始的思路错了,我认为的是补比换划算,其实是换比补划算。能换就换,不能换就补,傻了···加上确实心态没有调整好,被前面那道概率dp搞炸了,是真的菜
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
char num[10000];
int main()
{
int n;
int ans = 0;
while (~scanf("%d", &n))
{
while (n --)
{
scanf("%s", num);
ans = 0;
int m = 0;
int len = strlen(num);
int num1 = 0;
int num2 = 0;
for (int i = 0; i < len; i ++)
{
if (num[i] != '*')
{
num1 ++;
}
else
num2 ++;
}
if(num2 > num1)
{
m = num2 - num1 + 1;
num1 = num2 + 1;
ans = m;
}
for (int i = 0; i < len ; i ++)
{
if (num[i] == '*')
{
if (m <= 1)
{
if (num1 > num2)
{
for (int j = len - 1; j >= 0; j --)
{
if(num[j] != '*')
{
swap(num[i], num[j]);
ans ++;
m ++;
break;
}
}
}
else
{
ans ++;
i --;
m ++;
}
}
else
m --;
}
else
m ++;
}
printf("%d\n", ans);
}
}
}