(中等) CF 585D Lizard Era: Beginning,中途相遇。
In the game Lizard Era: Beginning the protagonist will travel with three companions: Lynn, Meliana and Worrigan. Overall the game has nmandatory quests. To perform each of them, you need to take exactly two companions.
The attitude of each of the companions to the hero is an integer. Initially, the attitude of each of them to the hero of neutral and equal to 0. As the hero completes quests, he makes actions that change the attitude of the companions, whom he took to perform this task, in positive or negative direction.
Tell us what companions the hero needs to choose to make their attitude equal after completing all the quests. If this can be done in several ways, choose the one in which the value of resulting attitude is greatest possible.
题目就是问能不能找到一组序列然后符合条件。。。
一眼看去就是中途相遇,n只有25,两个dfs就行了。。。
第一次用SBT维护的,然后1996ms险过,第二次改成sort,498ms,不得不说真是快啊。。。
代码如下:
// ━━━━━━神兽出没━━━━━━
// ┏┓ ┏┓
// ┏┛┻━━━━━━━┛┻┓
// ┃ ┃
// ┃ ━ ┃
// ████━████ ┃
// ┃ ┃
// ┃ ┻ ┃
// ┃ ┃
// ┗━┓ ┏━┛
// ┃ ┃
// ┃ ┃
// ┃ ┗━━━┓
// ┃ ┣┓
// ┃ ┏┛
// ┗┓┓┏━━━━━┳┓┏┛
// ┃┫┫ ┃┫┫
// ┗┻┛ ┗┻┛
//
// ━━━━━━感觉萌萌哒━━━━━━ // Author : WhyWhy
// Created Time : 2015年10月13日 星期二 17时27分11秒
// File Name : F.cpp #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h> using namespace std; const int MaxN=;
const int INF=0x3f3f3f3f; struct Num
{
int a,b; Num() {}
Num(int x,int y):a(x),b(y) {} bool operator < (const Num & y) const
{
return a==y.a ? b<y.b : a<y.a;
} bool operator > (const Num & y) const
{
return a==y.a ? b>y.b : a>y.a;
} bool operator == (const Num & y) const
{
return a==y.a && b==y.b;
} Num operator + (const Num & y) const
{
return Num(a+y.a,b+y.b);
}
}; struct State
{
Num n;
int base;
long long route; bool operator < (const State &b) const
{
return n<b.n;
} bool operator == (const State &b) const
{
return n==b.n;
}
}; bool cmp(const State &a,const State &b)
{
return a.n==b.n ? a.base>b.base : a.n<b.n;
} State sta[MaxN];
int cou; int N;
Num rem[][];
int rnum[]; int bbb;
long long lll; void dfs1(int d,Num tn,int b,long long l)
{
if(d>((N+)>>))
{
sta[cou].n=tn;
sta[cou].base=b;
sta[cou++].route=l;
return;
} for(int i=;i<;++i)
dfs1(d+,tn+rem[d][i],b+(i ? rnum[d] : ),(l<<)|i);
} void dfs2(int d,Num tn,int b,long long l)
{
if(d>N)
{
State ts;
ts.n.a=-tn.a;
ts.n.b=-tn.b; int p=lower_bound(sta,sta+cou,ts)-sta; if(p<cou && sta[p]==ts && sta[p].base+b>bbb)
{
bbb=sta[p].base+b;
lll=(sta[p].route<<(*(N/)))|l;
} return;
} for(int i=;i<;++i)
dfs2(d+,tn+rem[d][i],b+(i ? rnum[d] : ),(l<<)|i);
} void show()
{
int rrr[]; for(int i=;i<N;++i)
{
rrr[i]=lll & ;
lll>>=;
} for(int i=N-;i>=;--i)
if(rrr[i]==) puts("MW");
else if(rrr[i]==) puts("LW");
else puts("LM");
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); int a,b,c; scanf("%d",&N);
for(int i=;i<=N;++i)
{
scanf("%d %d %d",&a,&b,&c);
rnum[i]=a;
rem[i][]=Num(b,c);
rem[i][]=Num(-a,c-a);
rem[i][]=Num(b-a,-a);
} cou=;
bbb=-INF;
dfs1(,Num(,),,);
sort(sta,sta+cou,cmp);
cou=unique(sta,sta+cou)-sta;
dfs2((N+)/+,Num(,),,); if(bbb==-INF) puts("Impossible");
else show(); return ;
}
(中等) CF 585D Lizard Era: Beginning,中途相遇。的更多相关文章
- Codeforces 585D Lizard Era: Beginning
Lizard Era: Beginning 折半之后搜就完事了, 直接存string字符串卡空间, 随便卡卡空间吧. #include<bits/stdc++.h> #define LL ...
- Codeforces 585D. Lizard Era: Beginning(meet in the middle)
一眼题...这个数据范围也太明显了吧... suma1==suma2 && sumb1==sumb2 && sumc1==sumc2 相当于suma1-sumb1==s ...
- [codeforces] 585D Lizard Era: Beginning || 双向dfs
原题 有n(n<=2)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使n个任务结束后三个人得到的值是一样的.输出每次要派哪两个人,如果不行输出Impossible. n< ...
- Codeforces 585D Lizard Era: Beginning | 折半搜索
参考这个博客 #include<cstdio> #include<algorithm> #include<cstring> #include<map> ...
- Codeforces Round #325 (Div. 2) F. Lizard Era: Beginning meet in the mid
F. Lizard Era: Beginning Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- Codeforces 585.D Lizard Era: Beginning
D. Lizard Era: Beginning time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Codeforces Round #325 (Div. 1) D. Lizard Era: Beginning
折半搜索,先搜索一半的数字,记录第一个人的值,第二个人.第三个人和第一个人的差值,开个map哈希存一下,然后另一半搜完直接根据差值查找前一半的答案. 代码 #include<cstdio> ...
- CF585D Lizard Era: Beginning
嘟嘟嘟 题面我是不会咕的(没有真香):有\(n(n \leqslant 25)\)个任务和三个人,每次任务给出每个人能得到的值,每次任务选两个人,使\(n\)个任务结束后三个人得到的值是一样的,且尽量 ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
随机推荐
- git的理念
一个很好的git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1 集中式 ...
- nginx php mysql 集成安装包
经过多次的苦苦寻找,终于找到一款 集成了nginx 和mysql php的包.只需一键安装即可. 且可以修改其中的nginx mysql 与php的版本. 解压此文件lnmp???ɰ?n-1.6p-5 ...
- mysql 排序后获得某行的位置
假设有test表,下图为表机构和数据,score表示积分.现在要查询积分排名为第几的id?? 查询语句 select id,score,(@rowno:=@rowno+1) as rowno from ...
- ActionBar更改背景颜色(主题)
1.默认是黑色的背景, 2.更改主题theme为Theme.AppCompat.Light即可,清单文件主题如下: <application android:name="com.ith ...
- 笨方法学python--变量和命名
1 =(单等号)和==(双等号)的区别 =用来赋值, ==用来判断是否相等 2 x = 100 在操作符2侧加空格,易读 3 打印时,进行字符串拼接 print "there are&quo ...
- URL设置问题
URL设置那里删除了<item path="index.aspx" pattern="index.aspx"/>后,访问首页就不出来了,要加上/in ...
- sh语法入门学习
玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...
- Anton and Chess
Anton and Chess time limit per test 4 seconds memory limit per test 256 megabytes input standard inp ...
- Cocos2d 使用控制台打印的方法
1.打开当前项目的win32解决方案. 2.在解决方案管理器的win32文件夹下打开main.cpp 3.增加以下代码: #define USE_WIN32_CONSOLE //以下加到入口函数 #i ...
- Git学习 -- 搭建Git服务器
搭建环境 服务器端:CentOS 6.5 IP:192.168.101.129 客户端:CentOS 6.5 . Windows 服务器端: 创建repository版本库,例如/srv/test ...