题目链接:

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. c++文件读写相关

    在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: ...

  2. windows7 64 位 mysql 5.6.12 安装

    1.修改 my-default.ini 改名为 my.ini 内容修改为 [mysqld] loose-default-character-set = utf8    basedir = D:/mys ...

  3. 利用set实现去重

    最近读了一些有关于ES6的文章,觉得真是一个超级大的进步,就是不知道兼容性怎么样,鉴于我还在初学,先写个小例子练手,顺便时刻提醒自己要坚持学下去.未来的趋势肯定是替代es5没跑了. var arr=[ ...

  4. javascript实现ajax

    什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...

  5. Python面向对象OOP

    一 OOP     与C++和Java一样,Python同样具有OOP设计. 过程式:从前到后,一条一条,机器能接受的顺序性方式:方式大概为"首先你应该做什么,第二应该做什么,高级点的做点假 ...

  6. spoj 2319 BIGSEQ - Sequence

    You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need to fully partitio ...

  7. eclipse 比较好的插件

    tomcat 插件 egit github 插件 subeclipse 插件 Properties Editor Properties Editor 编辑java的属性文件,并可以自动存盘为Unico ...

  8. Jenkins 快速搭建持续集成环境

    持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...

  9. BAT等互联网公司薪资分享

  10. Count The Carries

    hdu:http://acm.hdu.edu.cn/showproblem.php?pid=4588 题意:给你 a,b两个数,然后让a到b之间的数做2进制的加法,问你与多少次进位.例如:1,3,1+ ...