#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
#define PB push_back
#define MP make_pair
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))
#define PI acos(-1.0)
#define INF 0x7FFFFFFF
#define LINF 1000000000000000000LL
#define eps 1e-8
typedef long long ll;
typedef unsigned long long ull;
string s1="goalkeeper";
string s2="striker";
string s3="midfielder";
string s4="defender";
struct node{
int id;
int val;
}p[33];
int mp[33][33];
int num[5];
int vis[33];
int m;
int ans;
map<string ,int > a;
map<string, int > name;
void dfs(int x,int g1,int g2,int g3,int g4)
{
int sum=0;
if(g1==1 && g2==2 && g3==4 && g4==4)
{
for(int i=0;i<23;i++)
{
if(vis[i])
{
sum+=p[i].val;
for(int j=i+1;j<23;j++)
if(vis[j])
sum+=mp[i][j];
}
}
ans=max(ans,sum);
return;
}
for(int i=x;i<23;i++)
{
if(!vis[i])
{
if(p[i].id==1&&g1>=1) continue;
if(p[i].id==2&&g2>=2) continue;
if(p[i].id==3&&g3>=4) continue;
if(p[i].id==4&&g4>=4) continue;
vis[i]=1;
if(p[i].id==1)
{
dfs(i,g1+1,g2,g3,g4);
}
if(p[i].id==2)
{
dfs(i,g1,g2+1,g3,g4);
}
if(p[i].id==3)
{
dfs(i,g1,g2,g3+1,g4);
}
if(p[i].id==4)
{
dfs(i,g1,g2,g3,g4+1);
}
vis[i]=0;
}
}
}
int main()
{
a[s1]=1;
a[s2]=2;
a[s3]=3;
a[s4]=4;
string na,s;
int val;
while(cin>>na)
{
CLR(mp);
CLR(num);
name.clear();
name[na]=0;
cin>>val>>s;
p[0].val=val;
p[0].id=a[s];
num[a[s]]++;
for(int i=1;i<23;i++)
{
cin>>na>>val>>s;
name[na]=i;
p[i].val=val;
p[i].id=a[s];
num[a[s]]++;
}
cin>>m;
for(int i=0;i<m;i++)
{
cin>>na>>s>>val;
mp[name[na]][name[s]]=val;
mp[name[s]][name[na]]=val;
}
if(num[1]<1 || num[2]<2 || num[3]<4 || num[4]<4)
{
printf("impossible\n");
continue;
}
ans=-INF;
CLR(vis);
dfs(0,0,0,0,0);
cout<<ans<<endl;
}
return 0;
}
UVALive 5025 Arranging Your Team dfs
最新推荐文章于 2021-10-26 20:16:39 发布