您的位置:首页 > 产品设计 > UI/UE

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

2017-11-01 20:56 369 查看
链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: