博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arranging Your Team HDU - 3720 【DFS】
阅读量:4966 次
发布时间:2019-06-12

本文共 2303 字,大约阅读时间需要 7 分钟。

思路

题意:此题大意是指首先给你23个队员的信息,包括他们的名字,能力值,在赛场上的职位。然后给出几个若能满足某两个队员同时在球场上就额外加上一定的值。最后让你从23个队员中选出11个人,使得最终的value最大。

具体思路:由于从样例中可以发现字符串比较多,加之需要进行姓名和姓名、score之间关系的记录,这就用到了map。利用dfs对所有队员进行遍历,具体说明在代码中指出。

AC代码

//#include
#include
#include
#include
#include
#include
#include
using namespace std;map
id;map
manid;int def = 4, mid = 4, str = 2, goal = 1;int sum[6], M, asso[24][24];int vis[24];int maxs = 0;struct Men{ int value, pos;};Men man[24];void init(){ string s = "defender"; id[s] = 1; s = "midfielder"; id[s] = 2; s = "striker"; id[s] = 3; s = "goalkeeper"; id[s] = 4;}void dfs(int last, int d, int m, int s, int g) //d, m, s, g分别指defenders, midfielders, strikers, goalkeeper,last可以避免重复{ if(d == 4 && m == 4 && s == 2 && g == 1) //满足条件时 { int cnt = 0; for(int i = 0; i < 23; i++) { if(vis[i]) { cnt += man[i].value; for(int j = i + 1; j < 23; j++) { if(vis[j]) { cnt += asso[i+1][j+1]; } } } } maxs = max(maxs, cnt); //不断记录所有情况,最后得到最大值 return ; } for(int i = last; i < 23; i++) { if(vis[i]) continue; if(man[i].pos == 1 && d >= 4) continue; if(man[i].pos == 2 && m >= 4) continue; if(man[i].pos == 3 && s >= 2) continue; if(man[i].pos == 4 && g >= 1) continue; vis[i] = 1; if(man[i].pos == 1) dfs(i, d+1, m, s, g); else if(man[i].pos == 2) dfs(i, d, m+1, s, g); else if(man[i].pos == 3) dfs(i, d, m, s+1, g); else if(man[i].pos == 4) dfs(i, d, m, s, g+1); vis[i] = 0; }}int main(){ // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); init(); string na, p; int v; while(cin >> na ) { cin >> v >> p; manid.clear(); man[0].value = v; manid[na] = 1; man[0].pos = id[p]; memset(sum, 0, sizeof(sum)); sum[id[p]] ++; for(int i = 1; i < 23; i++) { cin >> na >> v >> p; manid[na] = i + 1; man[i].value = v; man[i].pos = id[p]; sum[id[p]] ++; } cin >> M; memset(asso, 0, sizeof(asso)); for(int i = 0; i < M; i++) { string s1, s2; int s; cin >> s1 >> s2 >> s; asso[manid[s1]][manid[s2]] = s; //记录s1, s2同时存在时的score值 asso[manid[s2]][manid[s1]] = s; } if(sum[1] < 4 || sum[2] < 4 || sum[3] < 2 || sum[4] < 1) { cout << "impossible" << endl; continue; } memset(vis, 0, sizeof(vis)); maxs = -0x7ffffff; dfs(0, 0, 0, 0, 0); cout << maxs << endl; }}

转载于:https://www.cnblogs.com/KeepZ/p/11370706.html

你可能感兴趣的文章
SQL字符串传参
查看>>
前端基本功之居中
查看>>
oracle 中导出系统中现有rdbms_jobs中的脚本及schedules job的创建
查看>>
PintJS – 轻量,并发的 GruntJS 运行器
查看>>
jQuery Mapael – 呈现动态的矢量地图
查看>>
Subtle Patterns:网页纹理素材精品免费下载
查看>>
数据、信息与知识、思想之间的关联
查看>>
C++ 格式化输出 及 输入 流
查看>>
转-linux误删文件恢复
查看>>
black box黑盒测试
查看>>
hdu 2457 DNA repair
查看>>
hdu 4427 Math Magic
查看>>
第八周作业
查看>>
react 返回上一页
查看>>
oracle闪回使用以及删除存储过程恢复
查看>>
Box2d引擎之元素
查看>>
JS屏蔽Flash右键菜单
查看>>
第三次作业 四则运算
查看>>
阿里2015实习生招聘在线测试----编程题,设计有限任务响应队列
查看>>
C# 判断字符串为空的4种方法及效率
查看>>