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

 

 

 

你可能感兴趣的:(assembly)