题目链接:

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. qsort 函数用法

    用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数: 1 待排 ...

  2. 改进《完美让IE兼容input placeholder属性的jquery实现》的不完美

    <完美让IE兼容input placeholder属性的jquery实现>中的代码在IE9以下浏览器中会出错,原因是因为ie9以下的浏览器对input的标签的解释不同. 例如对以下文本框的 ...

  3. Linux on ASUS N550JK4700

    实际上,ASUS N550JK对Ubuntu 14.04的兼容性是相当好的,包括无线网卡.蓝牙.键盘背光的调节.触摸板的开关.音量的键盘调节都是安装后无需配置直接可以使用的,这是出乎意料的,因为这些功 ...

  4. C#【数据库】 Access类

    using System; using System.Data; using System.Data.OleDb; namespace AccessDb { /**//// <summary&g ...

  5. qt环境问题导致的编译错误

    /usr/include/qt5/QtCore/qprocess.h:245:24: error: missing binary operator before token "(" ...

  6. Git配置安装使用教程操作github上传克隆数据

    Git是何方神圣? Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容 ...

  7. oracle常见sql积累

    select lower('HELLO') from dual;select lpad(100, 5, '*') from dual;select sysdate + 1 / 24 from dual ...

  8. Egret HTTP网络

    HTTP 请求与响应: private createGameScene():void { //HTTP 1.0 var request = new egret.HttpRequest(); reque ...

  9. hadoop hdfs 命令行 设置文件夹大小的上限 quota:配额

    >bin/hdfs dfs -put readme.txt /finance >bin/hdfs dfs -du -s /finance > /finance >bin/hdf ...

  10. SVN:分支合并到主干

    合并日志: --- Merging r173674 through r175986 into '.': C src/test/java/com/test/rigel/sandbox/organizat ...