贪心算法(思路)

news2024/11/28 1:27:21

最近在cf上做了很多贪心的题,写篇博客来总结一下

Problem - C - Codeforces

看第一道题

不难看出,我们需要在数组中找到一段奇偶相间的序列,要使他们的和最大, 在图中我们假设[1,2]和[3,4]是奇偶相间的序列,我们在在这两段序列中找到一段连续的子序列使其和最大,首先我们要处理这两段序列之间的过渡,也就是我们如何从1到2跳转到3到4,这个好办,看看2到3这段序列的性质,一个奇数减去一个奇数剩下一个偶数,一个偶数减去一个偶数剩下的也是一个偶数,所以,如果是奇数与奇数或是偶数与偶数相邻,我们只需要加上(a[i]-a[i-1])%2==0这个条件就可以把它筛选出来了,但这个条件必须配上i使用,当i=0的时候i-1数组就会越界,如果我们在(a[i]-a[i-1])%2==0这个条件前面放一个i,就像这样i&&(a[i]-a[i-1])%2==0,当i==0的时候就会结束,不会进行下一个条件的判断。

我们再来看下一个问题,如何在[1,2]和[3,4]中找到和最大的子连续序列,这一步其实是为了证明贪心可行性,来思考一下什么时候我们要抛弃上一个子序列而选择下一个子序列,当上一个子序列和为负数的时候我们是不是要另开一个子序列,假设总序列为3 2 -9 4 5,我们发现3+2-9是负数了,如果我们选择把3 2 -9 4 5全都加起来,是不是会对4 5这个序列不利,既然是负的贡献,我们不妨把它抛弃掉只取4 5,这时候我们发现3+2-9<0的,给定一个变量suf我们直接取suf=std::max(suf,0)+a[i](a[i]是当前这个数组的元素)即可,这时我们会遇到一种情况,假如序列是17 4 -29 6 1怎么办,明显17+4要大于6+1,所以这是我们还需要一个变量ans用来记录前面的最大值就可以解决这个问题了

using i64 = long long;

void solve() {
    int n;
    std::cin >> n;

    std::vector<int> a(n);
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
    int ans = -1E9;
    int suf = -1E9;
    for (int i = 0; i < n; i++) {
        if (i && (a[i] - a[i - 1]) % 2 == 0) {
            suf = 0;
        }
        suf = std::max(suf, 0) + a[i];
        ans = std::max(ans, suf);
    }
    std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t;
    std::cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}

所以这种贪心适合于在一个数组里,存在很多段符合规律的子段,我们需要在子段里找到满足要求的子子段,通常是和最小或者最大和。这道题是局部最优找全局最优

可以总结出一个模版如下

int ans = -1E9;
int suf = -1E9;
for (int i = 0; i < n; i++) {
    if (i && 条件) {
        suf = 0;
    }
    suf = 用于积累;
    ans = 不断取更合适的子子区间;
}

 

Poblem - C - Codeforcese

而这道题是为了找出每一个全局最优,可以发现当(ai+aj)/2*2 ai和aj一个为奇数一个为偶数的时候才会产生运算后的结果比运算前的结果小1的效果,只有偶数的时候不可能产生奇数,而只有奇数的时候却可以产生偶数,进而产生-1的效果,所以当i为奇数的时候,masha会优先合成两个奇数,i为偶数的时候olya会将一个奇数和一个偶数合成,由于玛莎是先手,所以在olya的回合必定会存在偶数,所以我们可以发现每消耗3个奇数就可以产生一个-1,所以就相当于分配m个奇数,i=1玛莎会消耗2,i=2,olya会消耗1,以此类推,也就是说当我们消耗完3个奇数,下一次被分配必定是玛莎,所以只需要用m/3就可以知道有多少个-1产生,那么m%2=2的时候,此时还剩下两个奇数,刚好分配给玛莎不会产生-1,m%3=1时,只剩下一个奇数了,玛莎不得不合成奇数和偶数产生-1。

using i64 = long long;
void solve() {
	int n;
	std::cin >> n;
	i64 sum = 0;
	int odd = 0;
	for (int i = 1; i <= n; i++) {
		int a;
		std::cin >> a;
		sum += a;
		odd += a % 2;
		int res;
		if (odd == 1 && i == 1)res = 0;
		else {
			res = odd / 3;
			if (odd % 3 == 1) {
				res += 1;
			}
		}
		std::cout << sum - res << " \n"[i == n];
	}
	
}
int main() {
	std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
	int t;
	std::cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

所以代码如下,odd用于累加,res用于跟进最大值。 

Problem - E - Codeforces

这个E其实也是一个累加问题,E我之前写过一次题解cf918div4的E题讲解-CSDN博客 

大家自己看一下吧,总的来说就是从局部最优到全局最优的过程 

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

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

相关文章

如何在 Microsoft Edge 浏览器中启用自动刷新

你是否经常发现自己在使用 Microsoft Edge 时点击刷新按钮&#xff1f;如果您需要一个网页以设定的时间间隔自动更新&#xff0c;那么请接着往下看。 在这篇博文中&#xff0c;我们探讨如何在 Microsoft Edge 浏览器中启用和管理自动刷新功能。 为什么选择自动刷新&#xff1…

【分布式】分布式链路跟踪技术

为什么需要分布式链路追踪 提到分布式链路追踪&#xff0c;我们要先提到微服务。相信很多人都接触过微服务。微服务是一种开发软件的架构和组织方法&#xff0c;它侧重将服务解耦&#xff0c;服务之间通过API通信。使应用程序更易于扩展和更快地开发&#xff0c;从而加速新功能…

使用requests库测试post请求 操作流程

第一步 谷歌f12或其他抓包工具抓包&#xff0c;这里随机抓一个post请求 url&#xff1a;https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/groups/dadde766-b087-42da-8e67-d2499a520ee7/streams/a0119567-bf91-4314-ab75-f683ba6c0c0a/logs 第二步 导包 impo…

国科大计算机体系结构期末考试——停更,手写更快

题型一、第二章的画图 给一个逻辑表达式&#xff0c;画出晶体管级别的电路图 cmos电路的基本电路&#xff1a; 与非门的功能是对多个输入信号进行逻辑与操作&#xff0c;然后对结果进行取反。 或非门的功能是对多个输入信号进行逻辑或操作&#xff0c;然后对结果进行取反。 …

适用于安防 音响 车载等产品中中的音频接口选型分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

怎么使用EIDE进行调试STM32单片机?

cortex-debug 用法 - Blog - Embedded IDE Forum (em-ide.com) 【VScode Embedded IDE】Keil工程导入VScode&#xff0c;与Keil协同开发MCU_vscode编辑keil工程-CSDN博客 Vscode EIDECortex Debug搭建STM32开发仿真环境_vscode cortex-debug-CSDN博客 可以结合一下上述三位大…

帆软report 设置条件属性,值为负数标为红色功能时,不生效

详细情况&#xff1a; 在设置负数为红色功能前&#xff0c;已经有一个条件属性&#xff0c;数据集获取的值为空或者为0时&#xff0c;转换成 - 符号。如下图&#xff1a; 具体表单显示效果如下&#xff1a; 条件属性2设置 原因 因为条件属性1设置的 - 符号没有设置颜色&#xf…

怎么做拼团链接_生鲜果蔬商家都在用的小程序拼团系统

拼团链接&#xff1a;重塑营销新格局 在当今这个信息爆炸的时代&#xff0c;消费者面对海量信息&#xff0c;选择变得尤为重要。如何在众多品牌中脱颖而出&#xff0c;让消费者愿意主动为你驻足&#xff1f;答案就是——拼团链接。 拼团&#xff0c;是一种社交电商的创新形式。…

【网络】网络层ICMP协议

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

STM32的USB设备库

适用范围&#xff1a;“on the STM32F10xxx,STM32F37xxx, STM32F30xxx and STM32L15xxx devices.” STM32_USB-FS-Device_Lib_V4.0.0.rar&#xff08;访问密码&#xff1a;1666&#xff09;https://url48.ctfile.com/f/33868548-1000799917-a5409d?p1666 适用范围&#xff1…

入门实战丨Python小游戏经典案例

文章目录 写在前面判断与循环小游戏猜数游戏龙的世界 写在后面 写在前面 本期内容&#xff1a;两个个简单的Python小游戏入门案例。 实验需求&#xff1a;python 实验目标&#xff1a;掌握基本的判断与循环语句。 判断与循环 判断与循环是编程中非常重要的两个概念&#x…

DAC高速线缆:性能卓越的连接解决方案

DAC高速线缆是一种广泛应用于数据中心和云计算等领域的高性能连接解决方案。它通过直接连接设备之间的端口&#xff0c;实现了高速、低延迟的数据传输。本文将介绍DAC高速线缆的定义、组成、作用以及与光纤线的区别&#xff0c;同时提供详细的使用方法和相关问题的解答。 第一…

AlexNet(fashion-mnist)

前言 AlexNet相较于LeNet-5具有更深的网络结构&#xff0c;采用relu激活函数。 AlexNet 参数更多&#xff0c;计算量更大&#xff0c;计算速度更慢&#xff0c;精度更高。 netnn.Sequential(nn.Conv2d(1,96,kernel_size11,stride4,padding1),nn.ReLU(),nn.MaxPool2d(kernel…

启用Hyper-V的三种方法,总有一种适合你

想在Windows 10计算机上的虚拟机中安装并运行Linux或更早版本的Windows操作系统吗&#xff1f;你将很高兴知道&#xff0c;你不需要第三方虚拟化软件&#xff08;如VirtualBox&#xff09;来在Windows 10上安装和运行Linux和Windows。 Windows 10中的内置Hyper-V工具允许你创建…

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?

在互联网时代&#xff0c;爬虫技术被广泛应用于数据采集和处理。然而&#xff0c;在使用爬虫技术的过程中&#xff0c;经常会遇到IP被封禁的问题&#xff0c;这给数据采集工作带来了很大的困扰。因此&#xff0c;使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…

vscode中如何解决 Comments are not permitted(JSON中不允许注释)

vs code中如何解决Comments are not permitted&#xff08;JSON中不允许注释&#xff09;&#xff1f; 简单几步&#xff0c;让你轻松解决。 1.使用vscode打开json文件后&#xff0c;一些注释显示如图所示&#xff0c;有红色波浪线&#xff0c;影响阅读 2. 悬浮在波浪线报错信…

Flink构造宽表实时入库案例介绍

1. 安装包准备 Flink 1.15.4 安装包 Flink cdc的mysql连接器 Flink sql的sdb连接器 MySQL驱动 SDB驱动 Flink jdbc的mysql连接器 2. 入库流程图 3. Flink安装部署 上传Flink压缩包到服务器&#xff0c;并解压 tar -zxvf flink-1.14.5-bin-scala_2.11.tgz -C /opt/ 复…

史上最全的Mysql优化大全,总结

直接上总结图: MySQL调优与实操 SQL调优 适用于数据量较大的情况下 explain 可以通过explain关键字来分析SQL执行计划,然后进行适当的分析调优。 慢查询日志 永久生效 避免不走索引 1、尽量避免在字段开头模糊查询 2、尽量避免使用in 和 not in 3. 尽量避免进行 null 值的判断…

Redis 内存淘汰策略有哪些?过期数据如何删除?

Redis 在面试中出现的概率非常大&#xff0c;毕竟后端项目如果用到分布式缓存的话&#xff0c;一般用的都是 Redis。目前&#xff0c;还没有出现一个能够取代 Redis 的分布式缓存解决方案。 这篇文章中&#xff0c;我会分享几道 Redis 内存管理相关的问题&#xff0c;都很常见…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-5稳定性stability-李雅普诺夫Lyapunov

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-5稳定性stability-李雅普诺夫Lyapunov Stability in the sense of Lyapunov Assympototic Stability