1 条题解
-
0
自动搬运
来自洛谷,原作者为

lzqy_
生而绚烂,璀璨如花。搬运于
2025-08-24 22:19:00,当前版本为作者最后更新于2020-03-29 09:41:42,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
一道暴力搜索题,但是个人感觉并没有其他大佬写的那么复杂
思路就很简单,用一个来记录名字对应的编号,然后通过枚举取六个英雄的所有可能性(不需要考虑别的,纯枚举)。不会的点这里。
所以,我们用实现从~个数字里选个数字,且不考虑顺序(最简单、最基础的深搜)。
注意:
题目的坑点是
英雄组合可以重复,记得考虑这一点。
具体实现方法看代码(有详细注释):
#include <bits/stdc++.h> using namespace std; map<string,int>m; int together[100][100],power[100],a[100]={1},ans,n,K; //together[i][j]表示第i,j个英雄同时上阵增加的能力值; //power[i]表示第i个英雄的个人能力值; //a数组用来记录DFS枚举结果。 bool k[100]; void moni() { int pmax=0; for(int i=1; i<=6; i++) { pmax+=power[a[i]];//加上英雄的个人能力值 for(int j=1; j<=n; j++)//范围不大直接爆搜 if(k[j])//如果另一个英雄也上阵了 pmax+=together[a[i]][j]; } ans=max(ans,pmax);//更新最大值 } void dfs(int kk)//典型深搜 { if(kk==7||kk==n+1)//枚举完六个英雄或是n个英雄 moni(); else for(int i=a[kk-1]; i<=n; i++) if(!k[i])//如果第i个英雄没有上阵 { k[i]=1; a[kk]=i; dfs(kk+1); k[i]=0; } } int main() { string s,ss; cin>>n>>K; for(int i=1; i<=n; i++) { cin>>s>>power[i]; m[s]=i;//名字s对应编号i } for(int i=0; i<K; i++) { cin>>s>>ss>>h; together[m[s]][m[ss]]+=h; //注:此处要用+=来进行叠加 } dfs(1);//开始深搜 cout<<ans;//输出结果 return 0; }新手(个人的建议):
深搜的时候不用考虑那么多,只枚举简单的,至于后面的模拟,不要放在深搜里面执行,这样的思路会更清晰些。
- 1
信息
- ID
- 5241
- 时间
- 1000ms
- 内存
- 250MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者