洛谷 P2389 电脑班的裁员 解题报告

题意:

给定一段长为N的序列,选取其中的至多M段使这些子段和最大。


当N=1000时,我们可以采用动态规划解法

\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取(1选0不选)

则转移为
\(dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0])\)
\(dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j][1])+score[i]\)

其中\(i\)的一维可以滚动掉

Code:

#include <cstdio>
#include <cstring>
int max(int x,int y){return x>y?x:y;}
const int N=503;
const int inf=0x3f3f3f3f;
int dp[N][N][2],n,k,score[N];
void init()
{scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",score+i);memset(dp,-0x3f,sizeof(dp));dp[1][0][0]=0,dp[1][1][1]=score[1];
}
void work()
{for(int i=2;i<=n;i++)for(int j=0;j<=k;j++){dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0]);dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j][1])+score[i];}int ans=-inf;for(int i=0;i<=k;i++)ans=max(ans,max(dp[n][i][0],dp[n][i][1]));printf("%d\n",ans);
}
int main()
{init();work();return 0;
}

当N=100,000时,我们可以采用贪心解法
注意到每次选取时,一段连续的正数或者连续的负数,要么我们不取选它,要么全部选走。

我们先缩个点,使序列变成正负数交错的,其中,第一项和最后一项的负数我们一定不去选择,故舍去。

设当前有\(k\)个正数。

则当\(M>=k\)时,直接选取\(k\)个正数即可。

\(M<=k\)时,对每个正数,我们有两种选择,放弃它,或者跨过负数选择它。

则当选中一个负数\(a\)时,我们损失了\(-a\),当放弃一个正数\(b\)时,我们损失了\(b\)

则不管哪种情况,我们只需要找到绝对值最小的一个数,选择它或者放弃它

采用二叉堆维护这个最小值

当这个最小值被操作时,其实等价于新产生了一个权值为 它和它旁边的两个元素的权值和 的新元素,这时候产生的新数列一定会少一个正数

值得一提的是,当第一项和最后一项是负数的时候,不一定一定减少一个正数,所以我们根据贪心不去选择这些点即可

合并元素可以采用链表进行维护

Code:(实在是不好看QAQ)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define ll long long
#define P pair <ll,ll>
using namespace std;
const int N=1000010;
ll a[N],b[N],n0,k,n,pre[N],suc[N],cnt,used[N];
ll labs(ll x){return x>0?x:-x;}
void init()
{scanf("%lld%lld",&n0,&k);for(int i=1;i<=n0;i++)scanf("%lld",a+i);int k=0;a[0]=-1;while(a[k]<0) k++;for(int i=k;i<=n0;i++){if(a[i]*a[i-1]>0)b[n]+=a[i];elseb[++n]=a[i];}while(n&&b[n]<0) n--;for(int i=1;i<=n;i++){pre[i]=i-1;suc[i]=i+1;}suc[0]=1;suc[n]=0;
}
priority_queue <P,vector <P >,greater <P > > q;
P p;
void work()
{for(int i=1;i<=n;i++){if(b[i]>0) cnt++;p.first=labs(b[i]);p.second=i;q.push(p);}while(cnt>k){int pos=q.top().second;q.pop();if(used[pos]) continue;if(!suc[pos]&&b[pos]<0){suc[pre[pos]]=suc[pos];pre[suc[pos]]=pre[pos];continue;}if(!pre[pos]&&b[pos]<0){pre[suc[pos]]=pre[pos];suc[pre[pos]]=suc[pos];continue;}used[pre[pos]]=used[suc[pos]]=1;b[pos]+=b[pre[pos]]+b[suc[pos]];cnt--;if(pre[pos]){pre[pos]=pre[pre[pos]];suc[pre[pos]]=pos;}if(suc[pos]){suc[pos]=suc[suc[pos]];pre[suc[pos]]=pos;}p.first=labs(b[pos]),p.second=pos;q.push(p);}int now=suc[0];ll ans=0;while(now){if(b[now]>0) ans+=b[now];now=suc[now];}printf("%lld\n",ans);
}
int main()
{init();work();return 0;
}

当N=1,000,000时,我们可以将算法近似优化到\(O(N)\)

具体大家可以参考出题人的题解

我在这里解释一下这个近似,原题解没有说道找到第\(k\)值的问题

主要就是利用基于快速排序思想的STL函数\(nth\_element\),可以在近似\(O(n)\)的复杂度找到第\(k\)

关于第k值

代码我没写,感觉不太好写

转载于:https://www.cnblogs.com/butterflydew/p/9280322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈显 ipqq 发展历程 【附显 ipqq原理】

声明&#xff0c;本文章未经过疯狂绅士与runjin的同意不得转载。浅谈IPQQ软件的技术发展轨迹疯狂绅士、RunJin摘要&#xff1a;本文先给出了IPQQ的界定&#xff0c;并介绍了不同历史时期具有里程碑意义的IPQQ。根据几个具有里程碑意义的IPQQ&#xff0c;作者简要的分析了其技术…

for命令不跳过空白行_Java程序员必备:查看日志常用的linux命令

iwenhou趁周末&#xff0c;复习一下鸟哥的linux私房菜&#xff0c;看了文件内容查阅部分&#xff0c;做个笔记&#xff0c;哈哈&#xff0c;希望对你有帮助哦。catcat : 由第一行开始显示文件所有内容参数说明cat [-AbEnTv] 参数&#xff1a; -A : 相当于-vET 的整合参数&#…

Java并发编程笔记之Semaphore信号量源码分析

JUC 中 Semaphore 的使用与原理分析&#xff0c;Semaphore 也是 Java 中的一个同步器&#xff0c;与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的&#xff0c;那么&#xff0c;Semaphore 的内部实现是怎样的呢&#xff1f; Semaphore 信号量也是Java 中一个…

三款常用IP发包工具介绍

AntPower 版权所有© 2003 技术文章http://www.antpower.org 第1 页共14 页AntPower&#xff0d;技术文章三款常用IP 发包工具介绍小蚁雄心成员郎国军著lgjqingdao.cngb.comURL修订版本版本时间修订人说明AntPower 版权所有© 2003 技术文章http://www.antpower.org 第…

python中读取指定的行和列_Python怎么获取excle中指定行和列的值?

https://www.cnblogs.com/xiazhenyu/ *** 学而思之、思而记之、记而习之 ***f"dict_file.txt" #定义文件名 def writefile(key,value): with open(f, "w") as file: # 只需要将之前的”w"改为“a"即可&#xff0c;代表追加内容&#xff0c;“w”…

设计模式--命令模式

实验16&#xff1a;命令模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解命令模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用命令模式解决实际问题。 [实验任务]&#xff1a;多次撤销和重复的命令模式 某系…

进入显示器工厂模式的方法 【95种品牌 维修珍藏资料】

常见CRT显示器的工厂模式进入方法 谁家的电视机坏了&#xff0c;图像的颜色乱了&#xff0c;肯定要请电视机维修人员来修。但是大家也许听说过&#xff0c;有时候维修人员到了家里&#xff0c;连螺丝刀都不拿&#xff0c;只是把遥控器“乱”按一通&#xff0c;电视机的故障就…

SecureCRT SSH 语法高亮

主要原因1.term类型不对,不支持彩色.在secureCRT上设置Options->SessionOptions ->Emulation,然后把Terminal类型改成xterm&#xff0c;并点中ANSI Color复选框。然后ls看看,发现文件名和目录已经是彩色了.但是可能vi打开某些文件依然不是彩色按:进入命令模式输入syntax …

跨站脚本专题 XSS

再分享一下我老师大神的人工智能教程吧。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;还带黄段子&#xff01;希望你也加入到我们人工智能的队伍中来&#xff01;https://blog.csdn.net/jiangjunshow

wxpython界面切换_Python图形界面开发—wxPython库的布局管理及页面切换

前言 wxPython是基于Python的跨平台GUI扩展库&#xff0c;对wxWidgets&#xff08; C 编写&#xff09;封装实现。GUI程序的开发中界面布局是很重要的一个部分&#xff0c;合理的页面布局能够给予用户良好使用体验。虽然在GUI的控件和窗口布局上可以使用坐标&#xff0c;但更多…

javah找不到类文件

这样即可&#xff0c;在src目录下寻找类&#xff0c;类要写全&#xff0c;即包名.类名 转载于:https://www.cnblogs.com/Java-Starter/p/9283830.html

水木周平戏说中国网络黑幽默

1&#xff1a; 百度贴吧都知道吧&#xff0c;有狗吧&#xff0c;牛吧&#xff0c;十一生肖都有。&#xff08;没错&#xff01;只有十一生肖&#xff01;&#xff09;唯独没有鸡吧。我属鸡&#xff0c;为此我很伤心。----听说过草木皆兵吗&#xff1f; 2: 这个世界上最远的距离…

python卸载opencv_20.Windows python,opencv的安装与卸载

本机Windows7系统&#xff0c;之前安装了Python3.5的版本&#xff0c;后来因为要装opencv&#xff0c;而opencv只支持Python2.7的版本&#xff0c;所以需要将Python3.5进行卸载。在控制面板-卸载程序&#xff0c;将Python卸载后删除其注册表等残留文件 下载Python2.7&#xff0…

cookie和session 以及Django中应用

cookie和session 以及Django中应用 cookie和session机制 cookie和session机制 cookie机制采用的是在客户端保持状态的方案。作用就是为了解决HTTP协议无状态的缺陷所做的努力。 session机制采用的是一种在客户端与服务器之间保持状态的解决方案。由于采用服务器端保持状态的方案…

LinuX 硬盘分区细节详谈 【 整理至 LinuxSir BY FreeXploiT 】

系统引导过程及硬盘分区结构论述作者&#xff1a; zhy2111314来自&#xff1a; LinuxSir.Org ouc.edu.cn摘要&#xff1a; 本文是理论性文档&#xff0c;主要讲述系统引导过程以及硬盘的物理结构&#xff1b;正文一、系统引导过程简介系统引导过程主要由以下几个步骤组成(以硬盘…

GCD与LCM【数论】

题目大意&#xff1a; 给出两个数的GCDGCD和LCMLCM&#xff0c;求这两个数的最小差值。 IuputIuput 6 36 OutputOutput 6 思路&#xff1a; 一道数论题。 我们设这两个数分别为xx和yy且x≤yx≤y&#xff0c;ggcd(x,y)ggcd(x,y)&#xff0c;llcm(x,y)llcm(x,y)&#xff0c;那…

破解WEP密钥过程全解(上)

WLAN技术出现之后&#xff0c;“安全”就成为始终伴随在“无线”这个词身边的影子&#xff0c;针对无线网络技术中涉及的安全认证加密协议的攻击与破解就层出不穷。现在&#xff0c;因特网上可能有数以百计&#xff0c;甚至以千计的文章介绍关于怎么攻击与破解WEP&#xff0c;但…

bfc是什么_一次弄懂css的BFC

前言BFC在css的学习中是重要的但不易理解的概念&#xff0c;BFC也牵扯了很多其他问题&#xff0c;如浮动、定位、盒模型等&#xff0c;因此弄懂BFC是很有必要的。本文对BFC进行总结&#xff0c;希望对你有所帮助。BFC是什么&#xff1f;先看看MDN的定义&#xff1a;块格式化上下…

ES6模块的import和export用法总结

ES6之前已经出现了js模块加载的方案&#xff0c;最主要的是CommonJS和AMD规范。commonjs主要应用于服务器&#xff0c;实现同步加载&#xff0c;如nodejs。AMD规范应用于浏览器&#xff0c;如requirejs&#xff0c;为异步加载。同时还有CMD规范&#xff0c;为同步加载方案如sea…

windows网关详解 【了解网关的重要性,增加网络性能】【FreeXploiT综合文】

理解Windows中的路由表和默认网关 每一个Windows系统中都具有IP路由表&#xff0c;它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。路由表是TCP/IP通信的基础&#xff0c;本地计算机上的任何TCP/IP通信都受到路由表的控制。 理解路由表 你可以运行 route …