标签:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int star , dig ; 5 string s , t ; 6 7 int main () { 8 int T ; 9 scanf ("%d" , &T ) ; 10 while (T --) { 11 t.clear () ; 12 star = 0 ; dig = 0 ; 13 cin >> s ; 14 int minn = 0 ; 15 int n = s.size () ; 16 for (int i = 0 ; i < n ; i ++) { 17 if ( s[i] == ‘*‘) star ++ ; 18 else dig ++ ; 19 } 20 if (star == 0) { 21 puts ("0") ; 22 continue ; 23 } 24 if (dig == 0) { 25 printf ("%d\n" , star + 1) ; 26 continue ; 27 } 28 if (s[n-1] != ‘*‘) { 29 for (int i = 0 ; i < n ; i ++) if (s[i] == ‘*‘) {s[i] = ‘1‘ ; break ;} 30 s[n-1] = ‘*‘ ; 31 minn ++ ; 32 } 33 if (star+1 > dig ) minn += star+1 - dig ; 34 for (int i = 0 ; i < star+1 - dig ; i ++) t += ‘1‘ ; 35 t += s ; 36 n = t.size () ; 37 int _star = 0 , _dig = 0 ; 38 for (int i = 0 ; i < n ; i ++) { 39 if (t[i] != ‘*‘) { 40 _dig ++ ; 41 } 42 else { 43 if (_dig > 1) _dig -- ; 44 else { 45 _dig ++ ; 46 for (int i = n - 1 ; i >= 0 ; i --) if (s[i] != ‘*‘) {s[i] = ‘*‘ ; break ;} 47 minn ++ ; 48 } 49 } 50 } 51 cout << minn << endl ; 52 } 53 return 0 ; 54 }
这道题在算之前,你首先要保证两个条件符合:1,最后一位为‘*’ ;2,当前序列的 “数字总数” > " ‘*‘的总数“ 。
然后因为有了以上保证,现在进行交换操作肯定是最优的了,所以只要0(n)扫一遍,使每个‘*’都符合运算条件,不符合则与最后一个数字交换。
还要注意这里有个梗,当其全部是数字时,输出0 ;
标签:
原文地址:http://www.cnblogs.com/get-an-AC-everyday/p/4735659.html