题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3720

题目大意:

有23个人,告诉每个人的名字,能力值,以及踢球的位置。要求选出1个守门员,2个前锋,4个中场,4个后卫。给m个关系,该关系的两个人如果同时在场,就会得到相应的分数值va(注意va可以为负值)。求怎样安排使得在场的人总价值最大。

解题思路:

先处理出每种位置的人分布,然后枚举是哪几个人,凑成后更新总价值即可。注意va可能为负数。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 30
map<string,int>nameid;
vector<int>pos[5]; //pos[i]保存位置i的人员分布
map<string,int>posid; //位置的标号
int va[Maxn],add[Maxn][Maxn],ans;
bool vis[Maxn]; int Cal()
{
int res=0; for(int i=1;i<=23;i++) //已选了哪些人
if(vis[i])
res+=va[i];
for(int i=1;i<=23;i++) //人之间关系的相互影响
for(int j=i+1;j<=23;j++)
{
if(vis[i]&&vis[j])
{
res=res+add[i][j];
} }
return res;
}
void dfs4(int num,int cur)
{
if(num==4)
{
ans=max(ans,Cal()); //已全部选完了
return ;
}
for(int i=cur;i<pos[4].size();i++) //从下一个开始选
{
vis[pos[4][i]]=true;
dfs4(num+1,i+1);
vis[pos[4][i]]=false;
}
} void dfs3(int num,int cur)
{
if(num==4)
{
dfs4(0,0);
return ;
}
for(int i=cur;i<pos[3].size();i++)
{
vis[pos[3][i]]=true;
dfs3(num+1,i+1);
vis[pos[3][i]]=false;
}
} void dfs2(int num,int cur)
{
if(num==2)
{
dfs3(0,0);
return ;
}
for(int i=cur;i<pos[2].size();i++)
{
vis[pos[2][i]]=true;
dfs2(num+1,i+1);
vis[pos[2][i]]=false;
}
} void dfs1(int num,int cur)
{
if(num==1)
{
dfs2(0,0);
return ;
}
for(int i=cur;i<pos[1].size();i++)
{
vis[pos[1][i]]=true;
dfs1(num+1,i+1);
vis[pos[1][i]]=false;
}
} int main()
{
posid["goalkeeper"]=1; //书名对应标号
posid["striker"]=2;
posid["midfielder"]=3;
posid["defender"]=4; string name,job;
while(cin>>name)
{
nameid.clear();
for(int i=1;i<=4;i++) /
pos[i].clear();
memset(add,0,sizeof(add)); nameid[name]=1;
scanf("%d",&va[1]);
cin>>job;
pos[posid[job]].push_back(1); //该职业新增一人
for(int i=2;i<=23;i++)
{
cin>>name>>va[i]>>job;
nameid[name]=i; //人的标号
pos[posid[job]].push_back(i);//先找到该位置标号,然后添加该人
} int m; scanf("%d",&m);
while(m--)
{
string name2;
int tmp; cin>>name>>name2>>tmp; //人之间的关系值
add[nameid[name]][nameid[name2]]=tmp;
add[nameid[name2]][nameid[name]]=tmp;
}
if(pos[1].size()<1||pos[2].size()<2||pos[3].size()<4||pos[4].size()<4)
{
printf("impossible\n");
continue;
} ans=-INF;
memset(vis,false,sizeof(vis));
dfs1(0,0);
printf("%d\n",ans); }
return 0;
}

搜索-hdu-3720-Arranging Your Team的更多相关文章

  1. hdu 3720 Arranging Your Team 枚举

    不可能解可以直接判断. 搭配产生的附加分可以用一个二维数组保存. 枚举1442,4种类型的人,因为总人数只有23个,所以可以搜索暴力枚举,然后保存最优解. 注意trick,答案可能为负数,所以初始化a ...

  2. HDU 3720 Arranging Your Team(DFS)

    题目链接 队内赛里,匆匆忙忙写的. #include <cstdio> #include <cstring> #include <iostream> #includ ...

  3. HDU 3720 Arranging Your Team

    先分组,然后暴力:注意  初始化时不要为0 会有负数:我直接二进制枚举: dfs是正解:呵呵 #include <iostream> #include <cstdio> #in ...

  4. hdu3720 Arranging Your Team

    Arranging Your Team Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. Arranging Your Team HDU - 3720 【DFS】

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

  6. [搜索] hdu 4016 Magic Bitwise And Operation

    主题链接: http://acm.hdu.edu.cn/showproblem.php?pid=4016 Magic Bitwise And Operation Time Limit: 6000/30 ...

  7. 记忆化搜索 hdu 1331

    Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. [宽度优先搜索] HDU 1372 Knight Moves

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  9. HDU 3720 深搜 枚举

    DES:从23个队员中选出4—4—2—1共4种11人来组成比赛队伍.给出每个人对每个职位的能力值.给出m组人在一起时会产生的附加效果.问你整场比赛人员的能力和最高是多少. 用深搜暴力枚举每种类型的人选 ...

  10. Arranging Your Team

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=35800#problem/D #include <iostream> #inc ...

随机推荐

  1. golang bufio writer,reader 缓存规则

    读,写,缓冲区可以杜绝频繁的读,写动作1.写缓存,如果一次write的长度大于buffer长度那么久发送当前缓冲区的内容并且发送要写入的内容,就是不在缓存了.如果发送的内容小于buffer长度,就按缓 ...

  2. [Winfrom] 捕获窗体最大化、最小化和关闭按钮的事件

    const int WM_SYSCOMMAND = 0x112;const int SC_CLOSE = 0xF060;const int SC_MINIMIZE = 0xF020;const int ...

  3. 滚动条响应鼠标滑轮事件实现上下滚动的js代码

    <script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...

  4. oe 仓库管理

    需求情景: 销售电商, 其中有些产品 为代理销售(公司不管理库存,建立SO后直接由对应的供应商发货即可) 解决方案: SO 生成 DO 时候 , 源库存的取得逻辑        SO-->SHO ...

  5. 如何在search中动态的显示和隐藏tree中的字段

    在tree定义 invisible 来自context <field name="country_id" invisible="context.get('invis ...

  6. 取消开机window 设备选择

    问题:开机,出现window 设备选择,在win7 页面上会停留几秒.解决方案:win+R 输入 -msconfig 进入引导 把延迟改为3

  7. android studio集成环境搭建

    1 下载JDK(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)      An ...

  8. win32控制台实现按任意键退出的功能

    win7之后的五win32 控制台出现了程序运行完之后就立即结束的问题,程序员根本无法看输出的结果.未来让控制台运行完之后能够等待程序员的操作.可以使用: system("PAUSE&quo ...

  9. 10个简单实用的 jQuery 代码片段

    尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库. 今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 1.平滑滚动到 ...

  10. unix io 模型浅析

    POSIX中对同步IO和异步IO的规定: 同步IO操作:引起进程的阻塞直到IO操作完成,异步IO操作:IO操作不会引起进程阻塞 在UNIX下,有5中操作模型: 阻塞IO,非阻塞IO,IO复用,信号驱动 ...