Arranging Your Team

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=35800#problem/D

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <cstring>
  4 #include <string>
  5 #include <cstdio>
  6 #include <vector>
  7 #include <map>
  8 using namespace std;
  9 const int INF=1<<28;
 10 const int N= 32;
 11 
 12 bool vis[N];
 13 vector<int>p[N];
 14 map<string,int>name_id;
 15 map<string,int>pos_id;
 16 int value[N],link[N][N],ans;
 17 
 18 int res()
 19 {
 20     int ans1 = 0;
 21     for (int i = 1; i <= 23; i++)
 22         if(vis[i])
 23             ans1+=value[i];
 24     for (int i = 1; i <= 23; i++)
 25     {
 26         for (int j = i+1; j <= 23; j++)
 27         {
 28             if (vis[i]&&vis[j])
 29                 ans1+= link[i][j];
 30         }
 31     }
 32     return ans1;
 33 }
 34 
 35 void dfs4(int cnt,int pos)
 36 {
 37     if (cnt==4)
 38     {
 39         //cout<<res()<<endl;
 40         ans = max(ans,res());
 41         return ;
 42     }
 43     for (int i = pos; i <(signed)p[4].size(); i++)
 44     {
 45         vis[p[4][i]] = true;
 46         dfs4(cnt+1,i+1);
 47         vis[p[4][i]] = false;
 48     }
 49 }
 50 void dfs3(int cnt,int pos)
 51 {
 52     if (cnt==4)
 53     {
 54         dfs4(0,0);
 55         return ;
 56     }
 57     for (int i = pos; i <(signed)p[3].size(); i++)
 58     {
 59         vis[p[3][i]] = true;
 60         dfs3(cnt+1,i+1);
 61         vis[p[3][i]] = false;
 62     }
 63 }
 64 void dfs2(int cnt,int pos)
 65 {
 66     if (cnt==2)
 67     {
 68         dfs3(0,0);
 69         return ;
 70     }
 71     for (int i = pos; i < (signed)p[2].size(); i++)
 72     {
 73         vis[p[2][i]] = true;
 74         dfs2(cnt+1,i+1);
 75         vis[p[2][i]] = false;
 76     }
 77 }
 78 void dfs1(int cnt,int pos)
 79 {
 80     if (cnt==1)
 81     {
 82         dfs2(0,0);
 83         return;
 84     }
 85     for (int i = pos; i < (signed)p[1].size(); i++)
 86     {
 87         vis[p[1][i]] = true;
 88         dfs1(cnt+1,i+1);
 89         vis[p[1][i]] = false;
 90     }
 91 }
 92 void init()
 93 {
 94     ans = -INF;
 95     name_id.clear();
 96     memset(value,0,sizeof(value));
 97     memset(link,0,sizeof(link));
 98     memset(vis,false,sizeof(vis));
 99     for (int i = 1; i <= 4; i++)
100         p[i].clear();
101 }
102 int main()
103 {
104     pos_id["goalkeeper"] = 1;
105     pos_id["striker"] = 2;
106     pos_id["midfielder"] = 3;
107     pos_id["defender"] = 4;
108     string name,pos;
109     while(cin>>name)
110     {
111         init();
112         cin>>value[1]>>pos;
113         name_id[name] = 1;
114         p[pos_id[pos]].push_back(1);
115         for (int i = 2; i <= 23; i++)
116         {
117             cin>>name>>value[i]>>pos;
118             name_id[name] = i;
119             p[pos_id[pos]].push_back(i);
120         }
121         int m,val;
122         string name1,name2;
123         cin>>m;
124         while(m--)
125         {
126             cin>>name1>>name2>>val;
127             link[name_id[name1]][name_id[name2]] = val;
128             link[name_id[name2]][name_id[name1]] = val;
129         }
130         if (p[1].size() < 1||p[2].size() < 2||p[3].size() < 4||p[4].size() < 4)
131         {
132             printf("impossible\n");
133             continue;
134         }
135         dfs1(0,0);
136         printf("%d\n",ans);
137     }
138     return 0;
139 }
View Code

 

posted @ 2013-11-06 11:21  N_ll  阅读(175)  评论(0编辑  收藏  举报