XTU1150 Assembly Line A, B, C 三类产品排列

 中文题

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

 

View Code
  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 */

 

 

 

posted @ 2013-03-10 21:45  旅行的蜗牛  阅读(191)  评论(0编辑  收藏  举报