现充|junyu33

题解 P6248 【准备战斗,选择你的英雄】

思路都是复杂度O(Cn6)的,都是暴力枚举英雄,然后直接判断值。

曾经想写贪心最后放弃了。

这里介绍一种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循环即可。