[模拟]HDU3720 Arranging Your Team


这题就是由球队为背景的,大意:

首先给23行数据,每行数据分别为 队员名字,队员能力,队员位置

接下来输入一个数m,然后下面跟着m组数据,每组两个人名和一个能力值,意思是这两个人如果同时在场,能力值就额外变化这个数字,当然可能正也可能负

结果求从里面选出的指定人数的最大的能力值

比如第一组数据的结果是这么来的:

goalkeeper 90*1

defender    90*4

minfielder  90*4

strikers      90*2

额外还有50

加起来就是1030

附上队长焘哥的code
[c]
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=25;
const int MAX=10000000;
int add[N][N];
int ans[N],q,best,ad;
struct node
{
char name[35],kind[35];
int p;
}player[N];
char sa[35],sb[35];
bool cmp(node a,node b)
{
return strcmp(a.kind,b.kind)<0;
}
int s,m,d,g;
void set(char c)
{
if(c==’g’) g++;
if(c==’s’) s++;
if(c==’m’) m++;
if(c==’d’) d++;
}
int find(char s[35])
{
for(int i=1;i<=23;i++)
{
if(strcmp(s,player[i].name)==0)
return i;
}
return -1;
}
int cal()
{
int ret=0;
for(int i=1;i<=11;i++)
{
ret+=player[ans[i]].p;
for(int j=i+1;j<=11;j++)
ret+=add[ans[i]][ans[j]];
}
return ret;
}
void solve()
{
if(s<2 || m<4 || d<4 ||g<1)
{
best=-1;
return ;
}
for(int a=1;a<=d;a++)
for(int b=a+1;b<=d;b++)
for(int c=b+1;c<=d;c++)
for(int e=c+1;e<=d;e++)
{
ans[1]=a;
ans[2]=b;
ans[3]=c;
ans[4]=e;
for(int aa=d+1;aa<=g+d;aa++)
{
ans[5]=aa;
for(int bb=g+d+1;bb<=g+d+m;bb++)
for(int cc=bb+1;cc<=g+d+m;cc++)
for(int dd=cc+1;dd<=g+d+m;dd++)
for(int ee=dd+1;ee<=g+d+m;ee++)
{
ans[6]=bb;ans[7]=cc;ans[8]=dd;ans[9]=ee;
for(int i=d+g+m+1;i<=23;i++)
for(int j=i+1;j<=23;j++)
{
ans[10]=i;ans[11]=j;
best=max(best,cal());
}
}
}
}
}
int main()
{
//freopen("data.txt","r",stdin);
while(~scanf("%s%d%s",player[1].name,&player[1].p,player[1].kind))
{
s=m=d=g=0;
set(player[1].kind[0]);
for(int i=2;i<=23;i++)
{
scanf("%s%d%s",player[i].name,&player[i].p,player[i].kind);
set(player[i].kind[0]);
}
sort(player+1,player+24,cmp);
scanf("%d",&q);
memset(add,0,sizeof(add));
while(q–)
{
scanf("%s%s%d",sa,sb,&ad);
int a=find(sa),b=find(sb);
add[a][b]=add[b][a]=ad;
}
best=-MAX;
solve();
if(best==-1)
{
puts("impossible");
continue;
}
printf("%dn",best);
}
return 0;
}
[/c]

发表评论