题目大意:
  有一个长度为n的数列,A和B两个人轮流从两端取数,B先取,A想使分数严格小于B且尽量接近B,问两人分数之差最小是多少。

思路:
  折半搜索,先预处理出长度为part的最大差最小差,再预处理出后面一段能取到的不同差值,然后dfs,当范围等于part时,就在数组中二分查找一下。

 #include<cstdio>
#include<cctype>
#include<vector>
#include<ext/hash_set>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff,_inf=-0x80000000;
const int N=;
int a[N];
int max[N][N],min[N][N],ans,n,part;
inline void init() {
ans=_inf;
for(register int i=;i<=n;i++) {
for(register int j=;j<=n;j++) {
max[i][j]=_inf;
min[i][j]=inf;
}
}
for(register int i=;i<=n;i++) {
max[i][i-]=min[i][i-]=;
}
for(register int i=n;i;i--) {
for(register int j=i;j<=n;j++) {
int l=i,r=j;
int tmp=(a[l]>=a[r])?a[l++]:a[r--];
max[i][j]=std::max(a[l]+max[l+][r],a[r]+max[l][r-])-tmp;
min[i][j]=std::min(a[l]+min[l+][r],a[r]+min[l][r-])-tmp;
}
}
}
std::vector<int> v[N];
__gnu_cxx::hash_set<int> s;
void initPart2() {
part=std::min(,n/);
for(int i=;i<=n+-part*;i++) {
s.clear();
v[i].clear();
for(int j=;j<<<part;j++) {
int tmp=,l=i,r=i+part*-;
for(int k=;k<part;k++) {
tmp-=(a[l]>=a[r])?a[l++]:a[r--];
tmp+=(!(j&(<<k)))?a[l++]:a[r--];
}
if(s.find(tmp)==s.end()) {
s.insert(tmp);
v[i].push_back(tmp);
}
}
std::sort(v[i].begin(),v[i].end());
}
}
void dfs(int l,int r,int dif) {
if(r-l+==part*) {
std::vector<int>::iterator it=std::lower_bound(v[l].begin(),v[l].end(),-dif);
if(it==v[l].begin()&&*it==-dif) return;
if(it==v[l].end()||*it==-dif) it--;
if(dif+*it<) ans=std::max(ans,dif+*it);
return;
}
if(dif+min[l][r]>=) return;
if(dif+max[l][r]<=ans) return;
if(dif+max[l][r]<) {
ans=std::max(ans,dif+max[l][r]);
return;
}
int tmp=(a[l]>=a[r])?a[l++]:a[r--];
dfs(l+,r,dif+a[l]-tmp);
dfs(l,r-,dif+a[r]-tmp);
}
int main() {
getint();
while(~scanf("%d",&n)) {
for(register int i=;i<=n;i++) {
a[i]=getint();
}
init();
initPart2();
dfs(,n,);
if(ans!=_inf) {
printf("%d\n",-ans);
} else {
puts("The child will be unhappy...");
}
}
return ;
}

这段代码在SimpleOJ上交比暴力还慢。

[HDU6196]happy happy happy的更多相关文章

  1. hdu6196 happpy happy happy (meet in middle + 剪枝)

    题意 从1到n共计n(<=90)个物品,每个物品有一个价值a[i],儿子和爸爸轮流做游戏,儿子先手.儿子每次选价值最大的{最左边,最右边}的物品,如果价值一样大, 则选取最左边的物品. 爸爸每次 ...

随机推荐

  1. The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context,

    在iis7.0布署网站后运行的错误,大致意思是:数据保护操作是不成功的.这可能是由于没有为当前线程的用户加载用户配置文件的导致 解决办法: 先为自己的网站新建一个应用程序池,然后新建的应用程序池上右键 ...

  2. 比特币pow算法介绍

    Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...

  3. Web测试技术要领

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...

  4. 2->集群架构主机优化流程

    集群架构优化流程: 有道笔记分享链接

  5. MyEclipse自带且常用的快捷键和自己定义的快捷键方法步骤

    1.MyEclipse自带且常用的快捷键 内容提示(补全): Alt+/    导包快捷键: Ctrl+Shift+o    格式化代码: Ctrl+Shift+f    行代码位置上下调换: Alt ...

  6. UFLDL 教程学习笔记(四)

    课程地址:http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/ 在之前的练习中,图片比较小, ...

  7. python_selenium自动化测试框架

    设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享. 框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测 ...

  8. Linux系统的优势

    熟悉电脑的人都知道,Linux 相比较于 Windows 有着众多的优势,所以现在越来越多的电脑用户开始使用 Linux 进行办公.学习.总体来讲,Linux 的优势主要有以下几个方面. 一.开源.免 ...

  9. CCF CSP 201612-3 权限查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...

  10. 【51nod】1822 序列求和 V5

    题解 我是zz吧 nonprime[i * prime[j]] = 0 = = 还以为是要卡常,卡了半天就是过不掉 我们来说这道题-- 首先,我们考虑一个\(K^2\)做法 \(f_{k}(N) = ...