题目链接:

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. HDU5311 Hidden String

    Problem Description Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a str ...

  2. python3实现邮件发送程序

    刚开始的想法很简单,由于有上千封的邮件需要发出去,并且需要一条一条发送,不能转发或群发,每条邮件要署对方的姓名,并加上几个相同的符件,考虑到手工操作繁琐无趣,所以想到用程序实现,python好像非常胜 ...

  3. 用css3实现鼠标移进去当前亮其他变灰

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  4. CreateJS第0章- Canvas基础

    最近网页游戏比较火,以前做过一些小游戏,但是过段时间就都忘了,今天在这里记录一下学习过程,以备后用.做网页游戏有很多种框架,我是flash程序用Adobe出品的CreateJS最容易.基本上继承了fl ...

  5. 在apache上报错“The _imaging C module is not installed”

    我的环境是python2.7.8.django1.6.4.apache2.2. 问题:在django自带的runserver环境下没有任何报错,但是配置在apache上出现了 “The _imagin ...

  6. IOS各类问题

    1.The resource could not be loaded because the App Transport Security policy requires the use of a s ...

  7. jquery cleditor 光标经常点不进去问题解决方法 bootstrap 富文本框 控件

    cleditor 光标点不进去,原因是内嵌的html代码段 body没有赋值默认高度. 解决方法1.赋值options.bodyStyle  设置min-height值.缺点:不能跟随设备更新最低高度 ...

  8. 在uboot上创建菜单

    一.原理 菜单其实就是一个uboot中的命令,和其他的命令没有什么差别.  uboot启动时,如果进入uboot命令模式,先运行这个命令,就会打印出一个菜单界面. 在uboot的命令模式,通过键入“m ...

  9. python locals()和globals()

    Python有两个内置的函数,locals() 和globals(),它们提供了基于字典的访问局部和全局变量的方式. 首先,是关于名字空间的一个名词解释.是枯燥,但是很重要,所以要耐心些.Python ...

  10. 动态规划(方案还原):SGU 104 Little shop of flowers

    花店橱窗布置问题 时间限制:3000 ms 问题描述(Problem)    假设你想以最美观的方式布置花店的橱窗,你有F束花,每束花的品种都不一样,同时,你至少有同样数量的花瓶,被按顺序摆成一行.花 ...