码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ - 3983 - Crusaders Quest(思维 + 暴力)

时间:2018-10-02 20:34:58      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:eal   bst   return   pac   ring   枚举   自动   暴力   clu   

题意:

给出一个字符串,长度为9,包含三种各三个字母"a","g","o",如果一次消除连续三个一样的分数+1,消完自动向左补齐
其中可以消去任意字母,以求得更大的分数

思路:

1、如果能够消去两个xxx那么一定能消去第三个,那么答案为3
2、如果只能找到一个xxx,那么答案一定是 2,因为必须舍弃一个消除才能得到一组xxx
3、没有找到xxx,那么有两种情况,一种是1,一种是2,枚举三个字母,暴力删除后进行判断xxx的存在,如果存在,那么答案是2,不存在答案是1

代码:

#include<iostream>
#include<string>
using namespace std;
string sss[4] = {"ggg", "ooo", "aaa"};
string s[4] = {"g","o","a"};
int deal(string str, int sum) {
    int t = 4;
    while(t--) {
        for(int i = 0; i <= 2; i++) {
            int index = str.find(sss[i]);
            if(index != -1) {
                str = str.substr(0,index)+str.substr(index+3,str.size());
                sum ++;
            }
        }
    }
    return sum;
}
int del(string str) {
    int ans = -1;
    for(int i = 0; i <= 2; i++) {
        string tmp = str;
        int index = tmp.find(s[i]);
        while(index != -1) {
            tmp = tmp.substr(0,index)+tmp.substr(index+1,tmp.size());
            index = tmp.find(s[i]);
        }
        ans = max(deal(tmp,0), ans);
    }
    if(ans == 0) return 1;
    else return ans;
}
int main() {
    string str;
    int t;
    cin >> t;
    while(t--) {
        cin >> str;          
        int sum = deal(str, 0);
        if(sum == 3) cout << "3" << endl;
        else if(sum == 1) cout << "2" << endl;
        else cout << del(str) << endl;
    }
    return 0;
} 

ZOJ - 3983 - Crusaders Quest(思维 + 暴力)

标签:eal   bst   return   pac   ring   枚举   自动   暴力   clu   

原文地址:https://www.cnblogs.com/somliy/p/9737323.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!