题目链接:

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. iOS 相机手动对焦

    AVCaptureDevice的方法,之前查了网上和stackoverflow上,没有,于是自己试着做了下,成功了,分享下. //实例化 AVCaptureDevice *captureDevice ...

  2. JQuery无法获取动态添加的图片宽度问题解决办法

    $('.imgUl li,.v_img').click(function(){ var _left = 0; var _top = 0; $('body').append('<div class ...

  3. InvalidArgument=Value of '1' is not valid for 'index'

    用ListView实现点击ListView的项删除该项的效果,调用ItemSelectionChanged事件. 代码如下: private void listView1_ItemSelectionC ...

  4. Java 8 与 .Net的平台发展

    从早期版本中,我们已经可以领略到一些令人兴奋的特性.但是开发真Andrew C.Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net.比如,Java 8 中最令人期待的Lambda表 ...

  5. JQUERY1.9学习笔记 之属性选择器(一) 前缀选择器

    描述:选择指定属性值的元素,或者是以字符串开始其后跟随“-”符号的. jQuery( "[attribute|='value']" ) 例:查找出所有语言属性为en的链接. < ...

  6. atoi的实现

    #include <iostream> using namespace std; int atoi(char* s) { int retval=0; int n=1; if (*s=='- ...

  7. Ubuntu14.04 安装QQ(国际版)

    1.在/etc/apt/source.list文件中添加: deb http://packages.linuxdeepin.com/deepin trusty main non-free univer ...

  8. UIDevice-b

    typedef NS_ENUM(NSInteger, UIDeviceOrientation) //设备方向 { UIDeviceOrientationUnknown, UIDeviceOrienta ...

  9. Servlet常用类

    javax.servlet.ServletConfig;javax.servlet.ServletException;javax.servlet.http.HttpServlet;javax.serv ...

  10. 一定要记住这20种PS技术!!!会让你的照片美的不行!!!

    一种简单的数码照片后期润饰 1 打开图片,执行色像/饱和度(-40)降低饱和度. 2 新建一图层,将图层模式改为柔光,用画笔工具将需要润饰的部分画几下,这里可以利用色板方便的提取颜色 3 图片色彩过渡 ...