Codeforces 1239E. Turtle 折半
原文链接www.cnblogs.com/zhouzhendong/p/CF1239E.html
前言
咕了这么久之后,我的博客复活了!
题解
结论1
存在一个最优解\(A\)数组,满足\(\forall 1\leq i <n, A_{1,i}\leq A_{1,i+1}, A_{2,i}\geq A_{2,i+1}\)
证明提示:假设 \(A_{1,i} > A_{1,j},i<j\),那么,交换这两个值之后得到的答案严格不劣,另一行证法相同。
结论2
当\(A\)数组满足\(\forall 1\leq i <n, A_{1,i}\leq A_{1,i+1}, A_{2,i}\geq A_{2,i+1}\)时,从左上角走到右下角存在一种方案,使得经过的权值之和最大,并且经过整个第一行或整个第二行。
证明
定义路径 \(i\) 表示经过 \(A_{1,i}\) 和 \(A_{2,i}\) 的合法路径。那么可以证明,当 \(1<i<n\) 时,路径 \(i-1\) 和路径 \(i+1\) 中至少存在一个不劣于路径 \(i\) 。
具体地,记 \(s_i\) 表示路径 \(i\) 的权值和,那么
\]
假设 \(s_i>s_{i-1},s_i>s_{i+1}\) ,那么
\]
又因为
\]
所以
\]
矛盾,故 \(s_i\leq s_{i-1},s_i\leq s_{i+1}\) 二者至少有一个正确。
假设 \(s_i\leq s_{i-1}\) 成立,那么 \(A_{1,i}\leq A_{2,i-1}\) ,所以 \(A_{1,i-1}\leq A_{1,i}\leq A_{2,i-1}\leq A_{2,i-2}\),所以可以得到 \(s_{i-1}\leq s_{i-2}\),即
\]
于是可得 \(s_i\leq s_1\) 。
若 \(s_i\leq s_{i+1}\) ,则同理可得 \(s_i\leq s_n\) 。
综上所述,\(s_i\leq s_1,s_i\leq s_n\) 二者至少有一个正确。
所以,对于 \(1<i<n\) ,必然有 \(s_1\) 或者 \(s_n\) 不劣于 \(s_i\),所以,\(\max(s_1,s_n) = \max_{i = 1}^{n} (s_i)\) 。
于是结论2得证。
解决问题
我们现在要解决的问题变成:将最小值和次小值分别置于左上角和右下角,其余的数分成权值和尽量平均的两份,也就是最小化权值和的两部分 \(\max\) 。
由于输入的 \(a\) 数组值域较小,容易想到使用背包算法解决剩余的问题,并使用 bitset 优化,但是考虑到要记录方案,无法使用 bitset 。
考虑数的个数不多,我们可以采用折半的方法,每一半有 \(n-1\) 个数。对于每一半,分别暴力枚举每一个数是否被选,把所有方案状态压缩之后记到二维数组中。数组的两维分别表示选了几个数、这些数的和。
最后,再使用双指针扫描数组获取最优解即可。这部分可以参照代码理解。
代码
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"-----------------"#x"-----------------\n"
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\
For(_x,L,R) cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair <int,int> pii;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=26,S=N*50000;
int n,s;
vector <int> a,b;
bitset <S> va[N],vb[N];
int sta[N][S],stb[N][S];
void SolveA(int k,int cnt,int sum,int st){
if (k==n-1){
if (!va[cnt][sum]){
va[cnt][sum]=1;
sta[cnt][sum]=st;
}
return;
}
SolveA(k+1,cnt,sum,st);
SolveA(k+1,cnt+1,sum+a[k],st|1<<k);
}
void SolveB(int k,int cnt,int sum,int st){
if (k==n-1){
if (!vb[cnt][sum]){
vb[cnt][sum]=1;
stb[cnt][sum]=st;
}
return;
}
SolveB(k+1,cnt,sum,st);
SolveB(k+1,cnt+1,sum+b[k],st|1<<k);
}
int ans=1e9,ansa,ansb;
int res[2][N];
void chkans(int i,int j,int ap,int bp){
int val=max(ap+bp,s-ap-bp);
if (val<ans){
ans=val;
ansa=sta[i][ap];
ansb=stb[j][bp];
}
}
int main(){
n=read();
For(i,1,n*2)
a.pb(read());
sort(a.begin(),a.end());
reverse(a.begin(),a.end());
res[0][1]=a.back(),a.pop_back();
res[1][n]=a.back(),a.pop_back();
s=0;
for (auto i : a)
s+=i;
For(i,1,n-1)
b.pb(a.back()),a.pop_back();
SolveA(0,0,0,0);
SolveB(0,0,0,0);
For(i,0,n-1){
int j=n-1-i;
vector <int> bp;
For(k,0,s)
if (vb[j][k])
bp.pb(k);
For(k,0,s){
if (!va[i][k])
continue;
while (bp.size()>=2&&(bp[bp.size()-2]+k)*2>=s)
bp.pop_back();
if (bp.size()>0)
chkans(i,j,k,bp.back());
if (bp.size()>=2)
chkans(i,j,k,bp[bp.size()-2]);
}
}
int t0=1,t1=0;
For(i,0,n-2)
if (ansa>>i&1)
res[0][++t0]=a[i];
else
res[1][++t1]=a[i];
For(i,0,n-2)
if (ansb>>i&1)
res[0][++t0]=b[i];
else
res[1][++t1]=b[i];
sort(res[0]+2,res[0]+n+1);
sort(res[1]+1,res[1]+n);
reverse(res[1]+1,res[1]+n);
For(i,0,1){
For(j,1,n)
printf("%d ",res[i][j]);
puts("");
}
return 0;
}
Codeforces 1239E. Turtle 折半的更多相关文章
- codeforces 1006 F(折半搜索)
F. Xor-Paths time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- Codeforces 912 质因数折半 方格数学期望
A B #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #d ...
- Codeforces#498F. Xor-Paths(折半搜索)
time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec Memory Limit: 512 MBSubmit: xxx ...
- Codeforces Beta Round #96 (Div. 1) C. Logo Turtle —— DP
题目链接:http://codeforces.com/contest/132/problem/C C. Logo Turtle time limit per test 2 seconds memory ...
- Codeforces Round #297 (Div. 2) [ 折半 + 三进制状压 + map ]
传送门 E. Anya and Cubes time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- Codeforces H. Prime Gift(折半枚举二分)
题目描述: Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Gym 100231F Solitaire 折半搜索
Solitaire 题目连接: http://codeforces.com/gym/100231/ Description 给你一个8*8棋盘,里面有4个棋子,每个棋子可以做一下某个操作之一: 1.走 ...
- CodeForces 132C Logo Turtle (记忆化搜索)
Description A lot of people associate Logo programming language with turtle graphics. In this case t ...
随机推荐
- java之struts2之异常处理
1.在应用项目中,异常的出现时很正常的.而且项目上线后发生异常也很正常的.那么需要对这些异常有相应的处理机制,以便客户能够看你到更加友好的界面.Struts2中提供了异常处理机制. 2.Struts中 ...
- Centos Consul集群及Acl配置
一,准备工作 准备四台centos服务器,三台用于consul server 高可用集群,一台用于consul client作服务注册及健康检查.架构如下图所示 二,在四台服务器上安装consul 1 ...
- idea: unable to import maven project
新搭建的maven环境,使用idea创建maven项目时,一直提示 unable to import maven project,百度良久未解决 有说关闭防火前的,亲测无效,后看到说是maven-3. ...
- Widget Size and Position !!!!!!!!!!!!!!!!!!
https://medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407 I have read many ques ...
- 从Iterator到async/await
Generator和Async 引言 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程 ...
- python day5 lambda,内置函数,文件操作,冒泡排序以及装饰器
目录 python day 5 1. 匿名函数lambda 2. python的内置函数 3. python文件操作 4. 递归函数 5. 冒泡排序 6. 装饰器 python day 5 2019/ ...
- TFTP启动内核、设备树,NFS启动FS
一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E6321. 二.问题 ...
- 关于winsxs目录的处理
参考文档: 1.http://www.360doc.com/content/14/0415/12/7873863_369147503.shtml 2.http://www.360doc.com/con ...
- XSL-FO知识点【一】
XSL-FO 用于格式化供输出的 XML 数据. 什么是 XSL-FO? XSL-FO 是用于格式化 XML 数据的语言 XSL-FO 指可扩展样式表语言格式化对象(Extensible Styles ...
- Random Forest(sklearn参数详解)
2016年08月17日 10:32:42 铭霏 阅读数:36874 版权声明:本文为博主原创文章,博主转载请附加原文链接并声明. https://blog.csdn.net/u012102306/ ...