CF1899C Yarik and Array(DP,贪心)

题目链接

题目

在这里插入图片描述
A subarray is a continuous part of array.

Yarik recently found an array a
of n
elements and became very interested in finding the maximum sum of a non empty subarray. However, Yarik doesn’t like consecutive integers with the same parity, so the subarray he chooses must have alternating parities for adjacent elements.

For example, [1,2,3]
is acceptable, but [1,2,4]
is not, as 2
and 4
are both even and adjacent.

You need to help Yarik by finding the maximum sum of such a subarray.

Input
The first line contains an integer t
(1≤t≤104)
— number of test cases. Each test case is described as follows.

The first line of each test case contains an integer n
(1≤n≤2⋅105)
— length of the array.

The second line of each test case contains n
integers a1,a2,…,an
(−103≤ai≤103)
— elements of the array.

It is guaranteed that the sum of n
for all test cases does not exceed 2⋅105
.

Output
For each test case, output a single integer — the answer to the problem.

Example

inputCopy
7
5
1 2 3 4 5
4
9 9 8 8
6
-1 4 -1 0 5 -4
4
-1 2 4 -3
1
-1000
3
101 -99 101
20
-10 5 -8 10 6 -10 7 9 -2 -6 7 2 -4 6 -1 7 -6 -7 4 1

outputCopy
15
17
8
4
-1000
101
10

题目大意

t t t 组测试数据
每组给一个整数 n n n n n n 个整数(包含负数),问在这 n n n 个整数中,找和最大的连续子序列,要求是该子序列里的数是 奇偶交替的。

思路

这题我用的是dp的思路,定义一个状态数组f,对于 f i f_i fi 是以 a i a_i ai 开头的数列的最大值,
从后往前开始推,因为每个 f i f_i fi都是最大的, f i − 1 f_{i - 1} fi1 只用考虑在符合要求的前提下,是否要接上后面那串数列了。
f i = m a x ( f i , f i + f i + 1 ) f_i=max(f_{i}, f_i + f_{i + 1}) fi=max(fi,fi+fi+1)

代码

#include<bits/stdc++.h>
using namespace std;
const int N =1e6 + 10;
int a[N], f[N];
int main()
{int T; cin >> T;while (T -- ){int n; scanf("%d", &n);for (int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);f[i] = a[i]; //初始化状态 }int ans = -0x3f3f3f3f;for (int i = n - 1; i >= 1; i -- ){
//			判断条件,是否符合一奇一偶的顺序 if (abs(a[i]) % 2 != abs(a[i + 1]) % 2){f[i] = max(f[i], f[i] + f[i + 1]);}}for (int i = 1; i <= n; i ++ ){ans = max(ans, f[i]);}printf("%d\n", ans);}return 0;
}

总结

好久没打CF,生疏了,第二题暴力,思路对了,但很多细节没写好,比如最大值答案用了0x3f3f3f3f,事实上在long long int 的情况下0x3f3f3f3f是不够大的,连续改大了两次才写对。

这题先写了一遍暴力,错了,然后才想的优化。
暴力版

#include<bits/stdc++.h>
using namespace std;
const int N =1e6 + 10;
int a[N], f[N];
int main()
{int T; cin >> T;while (T -- ){int n; scanf("%d", &n);for (int i = 1; i <= n; i ++ ){scanf("%d", &a[i]);f[i] = a[i]}int ans = -0x3f3f3f3f;for (int i = 1; i <= n; i ++ ){ans = max(ans, f[i]);}for (int i = 1; i <= n; i ++ ){int sum = a[i];ans = max(sum, ans);for (int j = i + 1; j <= n; j ++ ){
//				cout << a[j] << " " << a[j] % 2 << endl;
//				cout << a[j  - 1] << " " << a[j - 1] % 2 << endl;if (abs(a[j] % 2) == abs(a[j - 1]) % 2){
//					cout << 11111111 << endl;break;}sum += a[j];ans = max(ans, sum);
//				cout << ans << endl;}}printf("%d\n", ans);}return 0;
}

之前还写岔了一次,如果都是正数的话,可以像下面这么写

//正数版 
#include<bits/stdc++.h>
using namespace std;
const int N =1e6 + 10;
int a[N];
int main()
{int T; cin >> T;while (T -- ){int n; cin >> n;for (int i = 1; i <= n; i ++ ){cin >> a[i];}int ans = -0x3f3f3f3f;int sum = a[1];ans = max(sum, ans);for (int i = 2; i <= n; i ++ ){if (a[i] % 2 == a[i - 1] % 2){ans = max(sum, ans);sum = a[i];}else{sum += a[i];}ans = max(sum, ans);}ans = max(sum, ans);cout << "      " << ans << endl;}return 0;
}

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

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

相关文章

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求&#xff1a;实现find &#xff0c;即在某个路径中&#xff0c;找出某…

windows 安装 Oracle Database 19c

目录 什么是 Oracle 数据库 下载 Oracle 数据库 解压文件 运行安装程序 测试连接 什么是 Oracle 数据库 Oracle数据库是由美国Oracle Corporation&#xff08;甲骨文公司&#xff09;开发和提供的一种关系型数据库管理系统&#xff0c;它是一种强大的关系型数据库管理系统…

Excel 文件比较工具 xlCompare 11.01 Crack

比较两个 Excel 文件之间的差异 xlCompare. xlCompare.com 是性能最佳的 Excel diff 工具&#xff0c;用于比较两个 Excel 文件或工作表并在线突出显示差异。xlCompare 包括免费的在线 Excel 和 CSV 文件比较服务以及用于比较和合并 Excel 文件的强大桌面工具。如果您想在线了…

基于蝠鲼觅食算法优化概率神经网络PNN的分类预测 - 附代码

基于蝠鲼觅食算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蝠鲼觅食算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蝠鲼觅食优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

贝加莱MQTT功能

贝加莱实现MQTT Client端的功能库和例程 导入库和例程&#xff0c;AS Logical View中分别通过Add Object—Library&#xff0c;Add—Program插入MQTT库和例程。 将例程Sample放置于CPU循环周期中 定义证书存放路径&#xff0c;在AS Physical View 中&#xff0c;右击PLC—Con…

R语言爬虫程序自动爬取图片并下载

R语言本身并不适合用来爬取数据&#xff0c;它更适合进行统计分析和数据可视化。而Python的requests&#xff0c;BeautifulSoup&#xff0c;Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容&#xff0c;你可以使用rvest包。 以下是一个简单的使用rvest包爬取…

CF1899B 250 Thousand Tons of TNT

题目链接 题目 题目大意 T T T 组测试数据 每组 n n n 个货物&#xff0c;第 i i i 个货物 的重量是 a i a_i ai​ 用k辆货车按顺序装这些货物&#xff0c;条件是每辆车上的货物个数都一样&#xff0c;也即是说 n n n 必须能被 k k k 整除&#xff0c; 求任意两辆车货物总…

C语言变量与常量

跟着肯哥&#xff08;不是我&#xff09;学C语言的变量和常量、跨文件访问、栈空间 栈空间还不清楚&#xff0c;期待明天的课程内容 C变量 变量&#xff08;Variable&#xff09;是用于存储和表示数据值的名称。 主要包括四个环节&#xff1a;定义、初始化、声明、使用 在我刚…

电子学会C/C++编程等级考试2021年09月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字判断 输入一个字符,如何输入的字符是数字,输出yes,否则输出no 输入 一个字符 输出 如何输入的字符是数字,输出yes,否则输出no 样例1输入 样例1输入 5样例1输出 yes样例2输入 A 样例2输出 …

Java 类之 java.util.Properties

Java 类之 java.util.Properties 文章目录 Java 类之 java.util.Properties一、简介二、主要功能1、存储键值对2、读取文件与属性代码示例运行结果截图 3、设置属性并保存文件代码示例结果截图 4、遍历属性代码示例运行结果 关联博客&#xff1a;《基于 Java 列举和说明常用的外…

MyBatis整合Spring Boot扫描Mapper相关配置

MyBatis是一款 Java 平台的优秀数据库映射框架&#xff0c;支持 XML 定义或注解&#xff0c;免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 针对 Spring 提供 Mapper 扫描注解&#xff1a; 集成 Spring Boot 时&#xff0c;可以通过 MapperScan 注解&#xff0…

Kotlin原理+协程基本使用

协程概念 协程是Coroutine的中文简称&#xff0c;co表示协同、协作&#xff0c;routine表示程序。协程可以理解为多个互相协作的程序。协程是轻量级的线程&#xff0c;它的轻量体现在启动和切换&#xff0c;协程的启动不需要申请额外的堆栈空间&#xff1b;协程的切换发生在用…

超全整理,Pytest自动化测试框架-多进程(pytest-xdist)运行总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常我们功能测试…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

Axure基础详解二十二:随机点名效果

效果演示 组件 建立一个【中继器】&#xff0c;内部插入一个“文本框”。【中继器】每页项目数为1&#xff0c;开始页为1。 设置交互 页面载入时交互 给【中继器】新曾行&#xff0c;“name”数据列添加10行数据&#xff0c;填入相应的名字&#xff1b;“shunxu”数据列全部…

金融业务系统: Service Mesh用于安全微服务集成

随着云计算的不断演进&#xff0c;微服务架构变得日益复杂。为了有效地管理这种复杂性&#xff0c;人们开始采用服务网格。在本文中&#xff0c;我们将解释什么是Service Mesh&#xff0c;为什么它对现代云架构至关重要&#xff0c;以及它是如何解决开发人员今天面临的一些最紧…

电子学会C/C++编程等级考试2021年06月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。输出 一行两个数,分…

Windows11怎样投屏到电视上?

电视屏幕通常比电脑显示器更大&#xff0c;能够提供更逼真的图像和更震撼的音效&#xff0c;因此不少人也喜欢将电脑屏幕投屏到电视上&#xff0c;缓解一下低头看电脑屏幕的烦恼。 Windows11如何将屏幕投射到安卓电视&#xff1f; 你需要在电脑和电视分贝安装AirDroid Cast的电…

Unity中Shader的矩阵加减法

文章目录 前言一、什么是矩阵矩阵就是一组数的阵列 二、矩阵的加法三、矩阵的负值四、矩阵的减法五、矩阵的表示 前言 Unity中Shader用到的矩阵加减法&#xff0c;以及矩阵的一些基础常识 一、什么是矩阵 矩阵就是一组数的阵列 1 2 3 4 5 6 二、矩阵的加法 两个矩阵相加就是…

我为什么开始写技术博客

今天没有技术文章&#xff0c;只是想聊聊认真做CSDN和公众号以来的一些感想。 1.为什么开启技术分享 我不算是一个聪明的人&#xff0c;没有过目不忘的本事&#xff0c;所以从工作开始就养成了做笔记的习惯&#xff1b; 最开始15、16年做模型开发&#xff0c;那时候环境其实就…