贪心算法(思路)

最近在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.mfbz.cn/a/320424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

什么是 Swagger? Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。它提供了一种规范的方式来定义、构建和文档化 RESTful Web 服务&#xff0c;使客户端能够发现和理解各种服务的功能。Swagger 的目标是使部署管理和使用功…

py爬虫入门笔记(request.get的使用)

文章目录 Day11. 了解浏览器开发者工具2. Get请求http://baidu.com3. Post请求https://fanyi.baidu.com/sug4. 肯德基小作业 Day21. 正则表达式2. 使用re模块3. 爬取豆瓣电影Top250的第一页4. 爬取豆瓣电影Top250所有的250部电影信息 Day31. xpath的使用2. 认识下载照片线程池的…

算法通关村第十六关—滑动窗口与堆结合(黄金)

滑动窗口与堆结合 堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位&#xff0c;返回滑动窗口中的最大值。  对于最大值、K个最大这种场…

k8s的存储卷(数据卷)

1、存储卷&#xff1a;容器内的目录和宿主机的目录进行挂载 2、容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态&#xff0c;一旦回到初始状态&#xff0c;所有的后…

Java环境变量——Windows和Linux配置jdk

本文我主要是介绍jdk的下载方式和在Windows系统下安装配置jdk11&#xff08;压缩包格式&#xff09;&#xff0c;其他格式的jdk以及Linux操作系统上的jdk安装我后续视情况进行更新… JDK的下载 大家可以去官网Java|Oracle下载对应的资源 继续往下翻&#xff0c;就可以看到Jav…

WorkPlus助力企业高效协作的企业级内网即时通讯解决方案

在企业内部&#xff0c;高效沟通和协作是推动工作顺利进行的关键。而企业级内网即时通讯成为了提升内部沟通效率的重要工具。作为一家领先的企业级内网即时通讯解决方案&#xff0c;WorkPlus以其卓越的性能和高安全性&#xff0c;打造了高效沟通协作的新标杆。 为什么选择WorkP…

【web服务搭建实验】之nginx基础学习

目录 一、nginx的简介二、nginx安装实验虚拟主机的配置web服务器的主流实现方式-LAMP和LNMP 一、nginx的简介 Nginx是一款轻量级HTTP服务器&#xff0c;同时也是代理邮箱服务器&#xff0c;具备反向代理&#xff0c;通用代理的功能。支持多个系统&#xff0c;和不同操作系统。…

Java内容

目录 1.命名规范 1.命名规范 2.变量

蓝桥杯省赛无忧 STL 课件18 总结

3226 宝藏排序 II 1624 小蓝吃糖果 2490 小蓝的括号串1 1531快递分拣

测试SpringBoot的时候报错mapper未装载的解决方案:

1.报错信息和截图&#xff1a; org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name com.tang.testspringboot.TestSpringBootApplicationTests: Unsatisfied dependency expressed through field mapper: No qualifying bean o…

室内定位相关中文期刊/学报笔记

这里写目录标题 文章最重要的部分通信学报1. 2023 基于扩散模型的室内定位射频指纹数据增强方法2. 2023 基于 CHAN 的改进卡尔曼滤波室内定位算法3. 2022 基于自适应蝙蝠算法的室内 RFID 定位算法4. 2017 基于核函数特征提取的室内定位算法研究5. 2021 基于CSI张量分解的室内Wi…

Spring MVC的类型转换器(ConversionServiceFactoryBean)

使用场景 在index.jsp里面添加日期类型 <form action"account/saveAccount" method"post">账户名称&#xff1a;<input type"text" name"name"><br/>账户金额&#xff1a;<input type"text" name&qu…

【beyond compare】默认不比较文件结尾

默认不比较文件结尾 git服务端的代码是UNIX 编码的&#xff0c;但是本地visual studio 是PC的&#xff0c; 代码一样&#xff0c;但是编码不同&#xff0c;导致compare 无法区分。 这位大神解决了这个问题,亲测可用&#xff1a; Beyond Compare之PC与UNIX文件比较问题 感谢大…

[Docker] Docker为什么出现

Docker为什么出现 一款产品&#xff1a; 开发–上线 -->两套环境 | 应用配置 开发即运维&#xff01; 环境配置十分麻烦&#xff0c;每一个机器都要部署环境&#xff08;Redis, ES, Hadoop&#xff09; 费时费力 项目带上配置环境安装打包。 传统&#xff1a; 开发jar&…

pgsql中epoch用法

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 昨天又被叫回来加班,説是数据问题,又回来加班搞,到了以后发现数据没问题,那就是查询接口的事了,写查询接口的人用时间戳去查询,明明直接可以直接用日期查询,非得改成时间戳查询,结果还是有问题,接下来复盘一下…

系列四、Spring Security中的认证 授权(前后端不分离)

一、Spring Security中的认证 & 授权&#xff08;前后端不分离&#xff09; 1.1、MyWebSecurityConfigurerAdapter /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configuration public class MyWebSecurityConfigurerAdapter extends WebSecuri…

相对原子质量和质子数和原子数的关系。

问题描述&#xff1a; 相对原子质量和质子数和原子数的关系。 问题解答&#xff1a; 相对原子质量&#xff08;相对原子质量单位&#xff0c;通常用amu表示&#xff09;和质子数、原子数之间存在一定的关系。这关系可以通过以下公式表示&#xff1a; 其中&#xff0c;是相对…

Unity与Android交互通信系列(4)

上篇文章我们实现了模块化调用&#xff0c;运用了模块化设计思想和简化了调用流程&#xff0c;本篇文章讲述UnityPlayerActivity类的继承和使用。 在一些深度交互场合&#xff0c;比如Activity切换、程序启动预处理等&#xff0c;这时可能会需要继承Application和UnityPlayerAc…

分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解

学习链接:分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解 资料链接:链接:https://pan.baidu.com/s/1ijvMQmwtRgLO4KDSsNODMw 提取码:vyok 神经网络的应用非常的广,它核心思想非常简单,就是人是如何认知感知并且处理这个世界中的现实问题的。…

[学习笔记]刘知远团队大模型技术与交叉应用L2-Neural Network Basics

本节首先介绍神经网络的一些基本构成部分。然后简要介绍神经网络的训练方式。介绍一种基于神经网络的形成词汇的向量表示的方法。接下来继续介绍常见的神经网络结构&#xff1a;RNN和CNN。最后使用PyTorch演示一个NLP任务的一个完整训练的Pipeline。 神经网络的基本组成 单个…