题解 P6248 【准备战斗,选择你的英雄】
思路都是复杂度
曾经想写贪心最后放弃了。
这里介绍一种stl的string类型字符串比较方法。
我们先需要两个结构体u与v,一个存英雄的属性,一个存附加条件(结合加成)。
struct hero{
string s;
int v;
}p[40];
struct extra{
string a;
string b;
int v;
}q[40];
关于string类型的比较有一个函数叫s1.compare(s2)或者s2.compare(s1),当它返回0时表示s1,s2相同,返回-1时表示不同。
这里的12个compare语句稍微有些难懂,这里解释一下。对于给定的一种组合,先用左边那个英雄跟所有选定英雄配对,再用右边的配对。因为左右两遍的英雄不会是同一个,所以是一种等价的写法,并不影响结果。只要有两组配对成功,就说明u,v这两种英雄都在选定英雄中存在,可以加上他们的附加值。
int getv(int a,int b,int c,int d,int e,int f){
int ans=p[a].v+p[b].v+p[c].v+p[d].v+p[e].v+p[f].v;
for(int i=1;i<=m;i++){
int flg=0;
string u=q[i].a,v=q[i].b;
if(u.compare(p[a].s)==0||v.compare(p[a].s)==0) flg++;
if(u.compare(p[b].s)==0||v.compare(p[b].s)==0) flg++;
if(u.compare(p[c].s)==0||v.compare(p[c].s)==0) flg++;
if(u.compare(p[d].s)==0||v.compare(p[d].s)==0) flg++;
if(u.compare(p[e].s)==0||v.compare(p[e].s)==0) flg++;
if(u.compare(p[f].s)==0||v.compare(p[f].s)==0) flg++;
if(flg==2) ans+=q[i].v;
}
return ans;
}
至于枚举部分,直接暴力六重for循环即可。