牡丹江K题,题目的目的就是达到每一时刻数字的个数>*号的个数即可,但是最后一个字符必须保证是*号,这样最优先就是所有数字都尽量在前面,所有*号都尽量住后面,尽量交换,因为交换的相当于插入两个数,如果开始的时候*的总个数比数字多,则先补齐。下面是ac代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std; char s[3000]; int len; void Insert(int n) { for(int i=len+n-1;i>=n;i--) { s[i]=s[i-n]; } for(int i=0;i<n;i++) { s[i]='1'; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int cnt1=0,cnt2=0,cnt=0; len=strlen(s); for(int i=0;i<len;i++) { if(s[i]=='*') { cnt2++; } else { cnt1++; } } if(cnt1<=cnt2) { Insert(cnt2-cnt1+1); cnt+=(cnt2-cnt1+1); len+=(cnt2-cnt1+1); } cnt1=cnt2=0; if(s[0]=='*') { for(int i=len-1;i>=0;i--) { if(s[i]!='*') { char tem=s[i]; s[i]=s[0]; s[0]=tem; cnt++; break; } } } for(int i=0;i<len;i++) { if(s[i]=='*') { cnt2++; } else cnt1++; if(cnt2==cnt1) { for(int j=len-1;j>i;j--) { if(s[j]!='*') { char tem=s[j]; s[j]=s[i]; s[i]=tem; cnt1++; cnt2--; cnt++; break; } } } } if((cnt2!=0) && (s[len-1]!='*')) { cnt++; } printf("%d ",cnt); } return 0; }