线性规划做法

同时也作为线性规划对偶的一个小小的学习笔记。

以下 \(\cdot\) 表示点积,\(b,c,x,y\) 是行向量。

\(A\) 是矩阵,对于向量 \(u,v\) 若 \(\forall i,u_i\leq v_i\) 则称 \(u\leq v\),\(\geq\) 同理。

线性规划标准型:

\[\max c\cdot x\\
s.t.
\left\{
\begin{aligned}
&Ax\leq b \\
&x\geq 0
\end{aligned}
\right.
\]

它的对偶是:

\[\min b\cdot y \\
s.t.
\left\{
\begin{aligned}
&A^Ty\geq c \\
&y\geq 0
\end{aligned}
\right.
\]

弱对偶定理:\(\max c\cdot x \leq \min b\cdot y\)。

我们可以任意取可行域中的 \(x,y\),然后对于 \(y^TAx\) 一方面由于 \(y^T\) 非负有 \(y^TAx\leq y^T b=b\cdot y\),另一方面 \(y^TAx=(yA^T)^Tx\geq c^Tx=c\cdot x\),即得证。

强对偶定理:\(\max c\cdot x = \min b\cdot y\)。也就是说我们可以把线性规划转为其对偶问题进行求解。

回到这道题,给每一个区间的每一种操作编号 \(1\sim M\),对于第 \(t\) 个操作设其下标集合为 \(I_t\),我们建一个变量 \(x_t\),表示这个操作重复做的次数。我们放宽 \(x_t\in R\),可以证明最优解仍然是整数。

将取等条件拆成两个条件,那么答案是:

\[\min \sum_{t=1}^M x_t\\
s.t.
\left\{
\begin{aligned}
&\sum_{t=1}^{M} [i\in I_t] x_t\geq a_i \\
&-\sum_{t=1}^{M} [i\in I_t] x_t\geq -a_i \\
&x_t\geq 0
\end{aligned}
\right.
\]

对偶一下,有:

\[\max \sum_{i=1}^n a_i(p_i-q_i)\\
s.t.
\left\{
\begin{aligned}
&\sum_{i=1}^{n} [i\in I_t](p_i-q_i)\leq 1 \\
&p_i,q_i\geq 0
\end{aligned}
\right.
\]

容易发现 \(p_i-q_i\) 可以取任意实数,设 \(y_i=p_i-q_i\),有:

\[\max \sum_{i=1}^n a_i y_i\\
s.t. \sum_{i=1}^{n} [i\in I_t]y_i\leq 1
\]

这里 yhx 大佬的博客中讲此矩阵是全单模矩阵,也就是说线性规划可行域的顶点全是整数所以这个线性规划具有整数性?不太了解什么是全单模 QAQ。

既然有整数性,那么考虑拿着这个东西做。该线性规划的实际意义是让我们对每个位置赋权,使得每种操作下标的权值之和都 \(\leq 1\)。

经典套路,类似最大子段和,记录三种操作后缀和的最大值 \(x,y,z\) 来 DP。由限制有 \(x,y,z\leq 1\)。而如果有 \(x/y/z<0\),那么我们就需要”截断“然后新开一个后缀。同时这也说明了 \(y_i\) 有意义的取值只有 \(0,1,-1\),\(<-1\) 的都是”截断“而总权值没有 \(-1\) 优秀所以一定不会取。

时间复杂度 \(O(n)\) 带 \(24\) 的常数。

#include <cstdio>
#include <algorithm>
#define forxyz \
for(int x=0;x<2;++x) \
for(int y=0;y<2;++y) \
for(int z=0;z<2;++z)
using namespace std;
int read(){
char c=getchar();int x=0;
while(c<48||c>57) c=getchar();
do x=(x<<1)+(x<<3)+(c^48),c=getchar();
while(c>=48&&c<=57);
return x;
}
typedef long long ll;
const int N=100003;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n;
int a[N];
ll f[N][2][2][2];
void solve(){
n=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=n;++i) forxyz f[i][x][y][z]=-INF;
f[0][0][0][0]=0;
for(int i=1;i<=n;++i){
forxyz{
for(int d=-1;d<=1;++d){
if(x+d>1||y+d>1) continue;
ll &dp=f[i][max(x+d,0)][z][max(y+d,0)];
dp=max(dp,f[i-1][x][y][z]+d*a[i]);
}
}
}
ll res=0;
forxyz res=max(res,f[n][x][y][z]);
printf("%lld\n",res);
}
int main(){
int tc=read();
while(tc--) solve();
return 0;
}

贪心做法

解析咕了,具体看洛谷题解区。

#include <cstdio>
#include <algorithm>
using namespace std;
int read(){
char c=getchar();int x=0;
while(c<48||c>57) c=getchar();
do x=(x<<1)+(x<<3)+(c^48),c=getchar();
while(c>=48&&c<=57);
return x;
}
typedef long long ll;
void solve(){
int n=read();
ll a=0,b=0,c=0,res=0,las=read();
for(int i=2;i<=n+1;++i){
ll x=0;
if(i<=n) x=read();
ll dlt=0;
if(x<a+b){
dlt=a+b-x;
if(a<dlt) b-=dlt-a,dlt=a;
if(b<dlt) a-=dlt-b,dlt=b;
a-=dlt;b-=dlt;x-=dlt;
}
x-=a+b;
ll mn=min(las,x);
res+=mn;las-=mn;x-=mn;a+=mn;
res+=las;c+=las;
x+=dlt;res-=dlt;
las=x;
swap(b,c);
}
printf("%lld\n",res);
}
int main(){
int tc=read();
while(tc--) solve();
return 0;
}

[ZJOI2020] 序列 线性规划做法/贪心做法的更多相关文章

  1. [HNOI2005]狡猾的商人 ,神奇做法——贪心

    洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法--贪心 看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现. ...

  2. 【t081】序列长度(贪心做法)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个整数序列,我们不知道她的长度是多少(即序列中整数的个数),但我们知道在某些区间中至少有多少个整数 ...

  3. hdu4737 A Bit Fun ——O(n)做法、错误的做法 + 正确做法

    囧== 下面的做法是错误的.下午在路上突然明白了== 哎,到现在还是只知道暴力的做法,囧爆了:http://www.cnblogs.com/liuxueyang/p/3322197.html 类似于前 ...

  4. 求序列完美度(trie+贪心)

    题目链接: 求序列完美度 题目描述 给出由n个数组成的序列s,规定第i个数s[i]到第j个数s[j]组成的子序列的完美度为该子序列中所有数的和与任意一个不在该子序列中的数进行异或运算得到的值中的最大值 ...

  5. 【BZOJ1345】[Baltic2007]序列问题Sequence 贪心+单调栈

    [BZOJ1345][Baltic2007]序列问题Sequence Description 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和a ...

  6. 【bzoj1283】序列 线性规划与费用流

    题目描述 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. 输入 第1行三个数N,m,k. ...

  7. 洛谷 P5470 - [NOI2019] 序列(反悔贪心)

    洛谷题面传送门 好几天没写题解了,写篇题解意思一下(大雾 考虑反悔贪心,首先我们考虑取出 \(a,b\) 序列中最大的 \(k\) 个数,但这样并不一定满足交集 \(\ge L\) 的限制,因此我们需 ...

  8. XDU 1037 倍流畅序列(字符串匹配+贪心)

    题目描述 对于一个0,1串s, 从左端开始读取它的0获得序列s0,从右端开始读取它的1获得s1,如果s0与s1同构,则称s为倍流畅序列.例如:011001是一个倍流畅序列, 因为:s0 = 0__00 ...

  9. Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )

    题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...

  10. 【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

    http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简 ...

随机推荐

  1. 关于QT编译程序找不到MSVCRT.DLL和其他动态链接库的解决办法

    先上图(一大堆无法解析的外部符号): 解决办法分两个步骤: 1.系统环境变量设置,把这些dll文件所在目录加入到PATH中.比如C:\Windows\SysWOW64, C:\Windows\Syst ...

  2. centos 添加yum源失败,ping 百度没响应

    1. curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.r ...

  3. 安装DevExpress VCL,使用时报错 某单元文件找不到的解决办法

    1.新建一个工程做为测试 2.点击projecct-->options 3. 4. 5.在上4图上的红框内加入packages文件 dxCoreRS27;dxGDIPlusRS27;dxComn ...

  4. 红米k40稳定版本刷开发版开启DC调光记录

    刷个开发版还要申请资格.要么去淘宝买资格的账号,要么用其他方法: 包21.4.15,直接有有防闪烁功能下载地址:https://bigota.d.miui.com/21.4.15/miui_ALIOT ...

  5. codec

    1.codec究竟是什么 音频解码芯片:Audio codec,又叫声卡:本质就是ADC和DAC 2.codec的作用 在移动设备中,codec的作用可以归结为4种,分别如下: playback:对P ...

  6. K8S 性能优化 - OS sysctl 调优

    前言 K8S 性能优化系列文章,本文为第一篇:OS sysctl 性能优化参数最佳实践. 参数一览 sysctl 调优参数一览 # Kubernetes Settings vm.max_map_cou ...

  7. 初识C 语言

    程序语言 C语言是目前极为流行的一种计算机程序设计语言,它既具有高级语言的功能,又具有汇编语言的一些特性.支持ANSIC. C语言的特点:通用性及易写易读 是一种结构化程序设计语言   具有良好的可移 ...

  8. 关于如何编写好金融科技客户端SDK的思考

    引言 回想起来,我在目前的团队(金融科技领域)待了有很长一段时间了,一直在做SDK研发,平时工作中经历过大刀阔斧一蹴而就的喜悦,也经历过被一个问题按在地上摩擦,无奈"废寝忘食"的不 ...

  9. 2021 技术展望丨AV1 在 RTC 应用实践中的现状与展望

    线上会议.在线教育.电商直播等多个场景的兴起,也使得实时互动技术从幕后走到台前,得到了更多人的关注.编解码.网络传输.计算机视觉等 RTE 相关的一系列技术也正焕发出更强的生命力.2021 年,在深度 ...

  10. vue路由加载页面

    当vue路由切换时,有时候会出现短暂白屏,需要添加一个加载状态 参考:buildadmin 地址:https://demo.buildadmin.com/#/ 利用vue的路由导航守卫:beforeE ...