hdu 3720——Arranging Your Team



#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
struct Player
{
    string name;
    int score;
    int pos;
    Player(){}
    Player(string nn,int ss,int pp)
    {
    	name=nn;
    	score=ss;
    	pos=pp;
    }
}player[4][50];
map<string,int> playerName;
string name1,name2;
int vis[50][50];
int val;
int m;
int cnt[4],num[4]={1,4,4,2};
string position,name;
int score;
int pos[4][4];
int ans;
void getDate(int i)
{
	if(position=="goalkeeper")
	    	player[0][cnt[0]++]=Player(name,score,i);
    	else 
		{
			if(position=="defender")
				player[1][cnt[1]++]=Player(name,score,i);
			else 
			{
				if(position=="midfielder")
					player[2][cnt[2]++]=Player(name,score,i);
				else
					player[3][cnt[3]++]=Player(name,score,i);
			}
		}
}
bool judge()
{
	for(int i=0;i<4;i++)
		if(cnt[i]<num[i])
			return 0;
	return 1;
}
void print()
{
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<cnt[i];j++)
			printf("%d ",player[i][pos[i][j]].pos);
		cout<<endl;
	}
		
}
void dfs(int sum,int n,int k,int x)// 正在確定的位置  當前位置確定數 
{
	if(n==4)
	{
		int ff=0;
		for(int i=0;i<4;i++)
			for(int j=0;j<num[i];j++)
				for(int ii=i;ii<4;ii++)
					for(int jj=0 ;jj<num[ii];jj++)
						if(ii==i&&j<jj)
							continue;
						else
							sum+=vis[player[i][pos[i][j]].pos][player[ii][pos[ii][jj]].pos];
		if(ans<sum)
				ans=sum;
			return;
		
	}
	if(k==num[n])
	{
		dfs(sum,n+1,0,-1);
		return;
	}
	for(int i=x+1;i<cnt[n];i++)
	{
		pos[n][k]=i;
		sum+=player[n][i].score;
		dfs(sum,n,k+1,i);
		sum-=player[n][i].score;
	}
}
int main()
{
    while(cin>>name>>score>>position)
    {
    	playerName.clear();
    	playerName[name]=0;
		memset(vis,0,sizeof(vis));
    	memset(cnt,0,sizeof(cnt));
    	getDate(0);
 		for(int i=1;i<=22;i++)
		{
			cin>>name>>score>>position;
			playerName[name]=i;
			getDate(i);
		}
		cin>>m;
		for(int i=0;i<m;i++)
		{
			cin>>name1>>name2>>val;
			vis[playerName[name1]][playerName[name2]]=val;
			vis[playerName[name2]][playerName[name1]]=val;
		}
		if(!judge())
			cout<<"impossible"<<endl;
		else
		{
			ans=-10000000;
			dfs(0,0,0,-1);
			cout<<ans<<endl;
		}
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章