Codeforces 585D Lizard Era: Beginning | 折半搜索
参考这个博客
#include<cstdio> #include<algorithm> #include<cstring> #include<map> #include<vector> typedef long long ll; using namespace std; map< pair<int,int> , pair<int,int> > mp; map< pair<int,int> , pair<int,int> > :: iterator it; int ans=-92345678,n,a[30][4]; ll front,back; vector <int> v; void dfs1(int x,int l,int m,int w,int f) { if (x>n/2) { it=mp.find(make_pair(l-m,w-m)); if (it!=mp.end()) { if (l>it->second.first) mp[make_pair(l-m,w-m)]=make_pair(l,f); } else mp[make_pair(l-m,w-m)]=make_pair(l,f); return ; } dfs1(x+1,l+a[x][1],m+a[x][2],w,f*3+0); dfs1(x+1,l+a[x][1],m,w+a[x][3],f*3+1); dfs1(x+1,l,m+a[x][2],w+a[x][3],f*3+2); } void dfs2(int x,int l,int m,int w,int f) { if (x>n) { it=mp.find(make_pair(m-l,m-w)); if (it!=mp.end()) { if (it->second.first+l>ans) { ans=it->second.first+l; front=it->second.second; back=f; } } return ; } dfs2(x+1,l+a[x][1],m+a[x][2],w,f*3+0); dfs2(x+1,l+a[x][1],m,w+a[x][3],f*3+1); dfs2(x+1,l,m+a[x][2],w+a[x][3],f*3+2); } void print(int x) { if (!x) puts("LM"); else if (x==1) puts("LW"); else puts("MW"); } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]); } dfs1(1,0,0,0,0); dfs2(n/2+1,0,0,0,0); if (ans>-92345678) { for (int i=(n+1)/2;i>=1;i--) { v.push_back(back%3); back/=3; } for (int i=n/2;i>=1;i--) { v.push_back(front%3); front/=3; } for (int i=v.size()-1;i>=0;i--) print(v[i]); } else puts("Impossible"); return 0; }