中文题
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1150
15070 | ny_lv10 | 1150 | Accepted | 936 KB | 0 MS | C++ | 1453 B | 2013-03-10 21:26:53 |
1 /* 2 http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1150 3 题目描述 4 胡大加工厂出产一种特殊零件。某天,客户到厂来查看零件。工厂生产的零件有三个质量等级从高到低分别为A、B、C,但是流水线上的零件质量参差不齐。为了给客户留下好的印象,胡大决定把流水线上的零件整理下,最前面既最左边为质量最高的A等级零件,接着为B、C等级的零件。胡大每次可以选择两个零件,互换其位置。为了节省体力,胡大想知道最少的互换次数。 5 6 输入 7 第一行是一个整数K,表示样例个数。 每组样例为一个字符串,由字符'A','B','C',组成,长度不超过1000个字符,表示零件的原始顺序。 8 9 输出 10 对于每组样例,输出一行,即最少的互换次数。 11 12 样例输入 13 2 14 CBA 15 ABAC 16 样例输出 17 1 18 1 19 20 测试数据: 21 5 22 CCCCCAAAAABBBBB 23 输出: 24 10 25 26 27 */ 28 29 #include <iostream> 30 #include <string> 31 using namespace std; 32 33 int st; 34 35 int main() 36 { 37 string str; 38 int k, len; 39 int i; 40 41 int a, b, c; 42 int bb, cc, c2; 43 cin>>k; 44 while (k--) 45 { 46 cin>>str; 47 a = b = c = 0; 48 bb = cc = c2 = 0; //bb,cc表示A区中的B,C数, c2表示B区中C的数量. 49 len = str.length(); 50 for (i=0; i<len ;i++) //统计A,B,C的个数.然后划分成3个区,依次为A区, B区, C区. 51 { 52 if (str[i] == 'A') a++; 53 else if (str[i] == 'B') b++; 54 else c++; 55 } 56 57 //A区统计B,C的个数 58 for (i=0; i<a; i++) 59 { 60 if (str[i] == 'B') 61 { 62 bb++; 63 } 64 else if(str[i] == 'C') 65 { 66 cc++; 67 } 68 } 69 st = bb; 70 //B区 71 for (i=a; i<b+a; i++) 72 { 73 //用区间B中的A换区间A中的B,区间B中的A不足,则用C来代替.(目的是将A区中的B全部换出去) 74 //如: A区中有2个B , B区有4个A,那么用A区中的2C + 2B 来换B区的4A. 75 //那么:cc -= 2, bb -=2; 76 // A区中有4个B, B区有2个A, 那么用B区的2C + 2A 来换A区的4B 77 //那么: bb -= 4; cc += 2; 78 //总之A区里的B全部置换完成,只会有A和C. 79 //然后将A区,B区的C和C区置换即可. 80 if (str[i] == 'A') 81 { 82 bb--; 83 if (bb < 0) // B1 > A2 把B区的C换到A区 84 cc++; 85 } 86 else if (str[i] == 'C') 87 { 88 c2++; 89 } 90 } 91 //if (bb > 0) //B1 < A2 ,把A去C 换到B区, 则A去的cc 要减掉换了的 92 //{ 93 // cc -= bb; 94 // c2 += bb; 95 //} 96 st += cc + c2; 97 cout <<st<<endl; 98 } 99 return 0; 100 } 101 102 /* 103 这道题相当的纠结,换过来换个去,弄了我2个小时..... 104 */