原题

有n(n<=2)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使n个任务结束后三个人得到的值是一样的。输出每次要派哪两个人,如果不行输出Impossible。


n<=25,325肯定不行,所以考虑折半3(n/2)。前一半我们得到a,b,c,后一半我们得到x,y,z,我们要得到a+x=b+y=c+z。将式子变形为a-b=y-x和b-c=z-y,所以用map记录a-b和b-c,以及对应的最大的a和状态(三进制表示)。然后查找y-x和z-y是否存在,得到答案即可。

#include<cstdio>
#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=-97797977,n,a[30][4];
ll front,back;
vector <int> v; int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
} 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) printf("LM\n");
else if (x==1) printf("LW\n");
else printf("MW\n");
} int main()
{
n=read();
for (int i=1;i<=n;i++)
{
a[i][1]=read();
a[i][2]=read();
a[i][3]=read();
}
dfs1(1,0,0,0,0);
dfs2(n/2+1,0,0,0,0);
if (ans>-97797977)
{
for (int i=n-n/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 printf("Impossible");
return 0;
}

最新文章

  1. apache如何解决跨域资源访问
  2. UIButton的文本与图片的布局
  3. Android中文TTS
  4. iOS——CALayer的shadow无效问题
  5. 安装mysql数据库中的技巧、错误排查以及实用命令(持续更新)
  6. 騰訊RTX的API開發,給RTX開個天窗
  7. 发布网站,报Access to the path is denied的解决办法
  8. Cocos2d-x MultipleTouch &amp; CCControllButton&#39;s confusion
  9. C#创建文件夹、文件
  10. [转]spring 监听器 IntrospectorCleanupListener简介
  11. 为什么使用enable_shared_from_this——shared_ptr两类错误
  12. css伪元素用法大全
  13. POJ 3261 可重叠k次最长重复子串
  14. Redis之(三)管理命令
  15. AIO系列文档(2)----TIO使用
  16. [转自大神]js拖拽小总结
  17. 【CF850E】Random Elections(FWT)
  18. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
  19. duilib进阶教程 -- 图片和文字的位置调整 (5)
  20. J2ee高并发情况下监听器

热门文章

  1. Oracle字符集的查看查询和Oracle字符集的设置修改(转载)
  2. C#爬虫实践
  3. linux命令讲解
  4. JAVA / MySql 编程——第六章 Mysql 创建账户的相关命令
  5. java中的构造方法(2013-05-05-bd 写的日志迁移
  6. python 学习心得
  7. Java实现Avl树
  8. 关于学习less后一些感悟
  9. 安装macports
  10. [转]全图形PPT设计指南