• 2017CCPC秦皇岛 C题Crusaders Quest&&ZOJ3983【模拟+STL】


    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3983

    题意:

    给定9个血槽,有三种物品,每次可以把连续相同的物品抵消掉,但是只有把连续三个的物品抵消才有价值,问你用哪种方案,能够使获得的价值最大。  

    思路:

    暴力就行,总有6种方案,维护一个最大值即可。

    代码:

    #include <iostream>
    #include <map>
    #include <vector>
    #include <cstring>
    
    using namespace std;
    vector<char>ss;
    bool vis[5];
    vector<int>qq;
    int ans=0;
    map<int,char>mp;
    
    void dfs(int u)
    {
         if(qq.size()==3)
            {
             int sum=0;
             vector<char>s;
             for(int i=0;i<ss.size();i++)
             {
                 s.push_back(ss[i]);
             }
             for(int i=0;i<qq.size();i++)
             {
                  for(int j=0;j<s.size();j++)
                  {
                     if(j+2<s.size())
                     {
                         if(s[j]==s[j+1]&&s[j+1]==s[j+2]&&s[j]==mp[qq[i]])
                         {
                            sum++;
                        }
                     }
                 }
                 int kk=3;
                 while(kk--)
                 {
                    for(int j=0;j<s.size();j++)
                    {
                     if(s[j]==mp[qq[i]])
                     {
                        s.erase(s.begin()+j);
                        break;
                     }
                   }
                 }
             }
             ans=max(ans,sum);
             return ;
         }
         for(int i=0;i<=2;i++)
         {
             if(!vis[i])
             {
                vis[i]=true;
                qq.push_back(i);
                dfs(i);
                qq.pop_back();
                vis[i]=false;
             }
         }
    }
    
    int main()
    {
        int t;
        char s1;
        mp[0]='g';
        mp[1]='o';
        mp[2]='a';
        cin>>t;
        while(t--)
        {
             ss.clear();
             for(int i=1;i<=9;i++)
             {
                 cin>>s1;
                 ss.push_back(s1);
             }
             ans=0;
             vector<char>w(ss.begin(),ss.end());
             int sum3=0;
             for(int i=0;i<w.size();i++)
             {
                 if(i+2<w.size()&&w[i]==w[i+1]&&w[i+1]==w[i+2])
                 {
                     sum3++;
                 }
             }
             ans=sum3;
             for(int i=0;i<=2;i++)
             {
                memset(vis,false,sizeof(vis));
                vis[i]=true;
                qq.clear();
                qq.push_back(i);
                dfs(i);
             }
             cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    实验四 主存空间的分配和回收模拟
    实验一
    实验3观后感
    实验三进程调度模拟程序
    实验2作业调度
    0909 学习操作系统
    实验四 主存空间的分配和回收模拟
    实验三 同学互评
    实验三 进程调度模拟程序
    实验二 作业调度模拟程序
  • 原文地址:https://www.cnblogs.com/darklights/p/7768422.html
Copyright © 2020-2023  润新知