• HihoCoder#1039:字符消除


    1039 : 字符消除

    时间限制:1000ms
    单点时限:1000ms
    内存限制:256MB

    描述
    小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母”ABC”的字符串s,消除过程是如下进行的:

    1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如”ABCCBCCCAA”中”CC”,”CCC”和”AA”会被同时消除,余下”AB”和”B”拼成新的字符串”ABB”。
    2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到”ABB”,再经过一轮消除得到”A”

    游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符(‘A’,’B’或者’C’),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。

    请帮助小Hi计算要如何插入字符,才能获得最高得分。

    输入
    输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
    之后T行每行一个由’A”B”C’组成的字符串s,长度不超过100。

    输出
    对于每一行输入的字符串,输出小Hi最高能得到的分数。

    提示
    第一组数据:在”ABCBCCCAA”的第2个字符后插入’C’得到”ABCCBCCCAA”,消除后得到”A”,总共消除9个字符(包括插入的’C’)。
    第二组数据:”AAA”插入’A’得到”AAAA”,消除后得到”“,总共消除4个字符。
    第三组数据:无论是插入字符后得到”AABC”,”ABBC”还是”ABCC”都最多消除2个字符。

    样例输入
    3
    ABCBCCCAA
    AAA
    ABC
    样例输出
    9
    4
    2

    话说,这种字符串删除的题我没有想到用STL中的东西,反而还在思考“字符数组移位真是难啊”。。。
    再这样,我真应该把自己一枪崩了。
    之前始终在想一次一次删除,然后组合成新字符串,再判断,再删除,但这样不行。这样的话,输入时”ABCCBCCCAA”时,输出应该是10。
    所以,思路是判断有无相邻相同的,有就一次性都标记成’D’,反正就只有‘A’ ‘B’ ‘C’。然后把‘D’一次性删个痛快。之后再组合成新的字符串,循环往复。
    这个题一开始我还想有多难,多麻烦。。。下次要想着念着vector。

    代码如下:

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    
    int max(int a,int b,int c)
    {
        if(a>b)
        {
            if(a>c)
            {
                return a;
            }
            else
            {
                return c;
            }
        }
        else
        {
            if(b>c)
            {
                return b;
            }
            else
            {
                return c;
            }
        }
    }
    
    bool check(vector <char> a)
    {
        int count;
    
        for(count=0;count+1<a.size();count++)
        {
            if(a[count]==a[count+1])
                return true;
        }
        return false;
    }
    
    vector <char> biaoji(vector <char> a)
    {
        int count;
        int size=0;
    
        for(count=0;count+1<a.size();count++)
        {
            int count2=0;
            if(a[count]==a[count+1])
            {
                char deng = a[count];
                a[count]= 'D';
    
                for(count2=count+1;count2<a.size();count2++)
                {
                    if(a[count2]!=deng)
                        break;
                    else
                    {
                        a[count2]='D';
                    }
                }
                count=count2-1;
            }
        }
        return a;
    }
    
    vector <char> delete_c(vector <char> a)
    {
        int count;
        vector <char> b;
        for(count=0;count<a.size();count++)
        {
            if(a[count] != 'D')
            {
                b.push_back(a[count]);
            }
        }
        return b;
    }
    
    int caluate(string cal)
    {
        vector <char> a;
        vector <char> b;
        int i;
        for(i=0;i<cal.size();i++)
        {a.push_back(cal[i]);}
    
        for(i=0;i<cal.size();i++)
        {b.push_back(cal[i]);}
    
        int count,result=0;
        do
        {
            a=biaoji(a);
            a=delete_c(a);
        } while (check(a));
    
        return b.size()-a.size();
    }
    
    void Result(string cal)
    {
        int count,result=0;
        for(count=0;count<cal.size();count++)
        {
            string temp_str1 = cal;
            int temp1 = caluate(temp_str1.insert(count,"A"));
    
            string temp_str2 = cal;
            int temp2 = caluate(temp_str2.insert(count,"B"));
    
            string temp_str3 = cal;
            int temp3 = caluate(temp_str3.insert(count,"C"));
    
            int temp=max(temp1,temp2,temp3);
    
            if(result<temp)
                result=temp;
        }
        cout<<result<<endl;
    }
    
    int main()
    {
        int count;
        cin>>count;
    
        while(count--)
        {
            string cal;
            cin>>cal;
    
            Result(cal);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [BZOJ 3774] 最优选择 【最小割】
    [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
    [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
    [XJOI NOI2015模拟题13] B 最小公倍数 【找规律】
    [XJOI NOI2015模拟题13] A 神奇的矩阵 【分块】
    [XJOI NOI02015训练题7] B 线线线 【二分】
    Java+Maven+selenium+testng+reportng自动化测试框架
    selenium实例:unittest框架+PO开发模式
    WebDriver驱动下载地址
    testng 执行多个suite
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785905.html
Copyright © 2020-2023  润新知