CF1899C Yarik and Array(DP,贪心)

news2024/12/28 6:34:20

题目链接

题目

在这里插入图片描述
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.coloradmin.cn/o/1222448.html

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

相关文章

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)

公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…

虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火

一、故障现象 一辆2015款奔驰G63AMG车&#xff0c;搭载157发动机&#xff0c;累计行驶里程约为9.4万km。车主反映&#xff0c;该车低速行驶时&#xff0c;发动机偶尔会自动熄火&#xff0c;故障大概1个星期出现1次。 二、故障诊断 接车后路试&#xff0c;故障未能再现。用故障检…

简单线性回归函数

简单线性回归函数 定义术语理解简单线性回归例子 定义 线性回归&#xff1a;利用线性回归方程中最小平方函数对一个或多个自变量和因变量之间关系进行建模的一个回归分析。该建模的目标为找到各个系数的最佳值让预测误差最小 简单线性回归&#xff1a;只有一个自变量的线性回…

重磅消息:ChatGPT创始人Sam Altman被开除!

OpenAI CEO Sam Altman 将离开公司&#xff0c;GregBrockman 将辞去董事会主席一职。首席技术官 Mira Murati将担任临时CEO。 至于 Altman 先生的离职&#xff0c;这是董事会经过深思熟虑的宙查后做出的决定。董事会发现 Altman 在与董事会的沟通中并非始终保持坦率&#xff0c…

WebGoat通关攻略之 SQL Injection (intro)

SQL Injection (intro) 1. What is SQL? 本题练习SQL查询语句&#xff0c;就是写一句SQL获取叫Bob Franco所在的department SELECT department FROM employees WHERE first_name Bob AND last_name Franco成功通关&#xff01; 2. Data Manipulation Language (DML) 本题…

一些RLHF的平替汇总

卷友们好&#xff0c;我是rumor。 众所周知&#xff0c;RLHF十分玄学且令人望而却步。我听过有的小道消息说提升很大&#xff0c;也有小道消息说效果不明显&#xff0c;究其根本还是系统链路太长自由度太高&#xff0c;不像SFT一样可以通过数据配比、prompt、有限的超参数来可控…

python引入自己不同目录的模块

1.目录结构 from manual_data.utils import delete_and_insert_center

时间序列预测:移动平均线、指数平滑和 SARIMA

一、说明 在我的上一篇文章中&#xff0c;我们介绍了用于数据分析和清理的不同技术&#xff0c;以准备用于预测的数据。在完成数据的分析和提炼后&#xff0c;我们成功实现了获得不存在任何缺失值、异常值或其他异常的原始数据集的目标。 现在&#xff0c;我们将继续使用上一篇…

【算法每日一练]-图论(保姆级教程 篇4(遍历))#传送门 #负环判断 #灾后重建

今天继续 目录 题目&#xff1a;传送门 思路&#xff1a; 题目&#xff1a;负环判断 思路&#xff1a; 题目&#xff1a;灾后重建 思路&#xff1a; 题目&#xff1a;传送 门 思路&#xff1a; 先跑一边floyd&#xff0c;然后依次加入每个传送门&#xff0c;O(n^5)不行…

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; 求任意两辆车货物总…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

利用ETLCloud自动化流程实现业务系统数据快速同步至数仓

现代企业有不少都完成了数字化的转型&#xff0c;而还未转型的企业或商铺也有进行数字化转型的趋势&#xff0c;由此可见&#xff0c;数据已经成为企业决策的重要依据。企业需要先获取数据&#xff0c;将业务系统数据同步至数仓进行整合&#xff0c;然后再进行数据分析。为了更…

vivado产生报告阅读分析7-时序报告3

1、“ Timing Summary Report ”详情 “ Timing Summary Report ” &#xff08; 时序汇总报告 &#xff09; 包含下列部分 &#xff1a; • “ General Information ”部分 • “ Timer Settings ”部分 • “ Design Timing Summary ”部分 • “ Clock Summary ”部…

代码随想录算法训练营第五十八天丨 动态规划part18

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

Leetcode刷题详解——斐波那契数

1. 题目链接&#xff1a;509. 斐波那契数 2. 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1…

mock测试数据

1.下载一个jar 架包 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1G5rVF5LlIYpyU-_KHsGjOA?pwdab12 提取码&#xff1a;ab12 2.配置当前电脑java环境变量 3.在同一文件目录下创建json 数据4.在终端切换到当前目录下启动服务&#xff0c; java -jar ./moco-r…

无损音频播放软件 Colibri mac中文版特点介绍

Colibri for mac是一款轻量级的音频播放器软件。它具有简洁的界面设计和快速启动速度&#xff0c;能够提供流畅的音频播放体验。Colibri支持多种常见的音频格式&#xff0c;包括MP3、FLAC、ALAC、AAC等。它还提供了一些实用的功能&#xff0c;如音频均衡器、音频增益控制、播放…

Go 语言数组基础教程 - 数组的声明、初始化和使用方法

数组用于在单个变量中存储相同类型的多个值&#xff0c;而不是为每个值声明单独的变量。 声明数组 在Go中&#xff0c;有两种声明数组的方式&#xff1a; 使用var关键字&#xff1a; 语法 var array_name [length]datatype{values} // 这里定义了长度 或者 var array_n…

asp.net 学校资源信息管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 学校资源信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net学校资源管理系统 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL …

hahahaha发到这里吧

一大早上笑死我 恭喜在座的各位&#xff0c;一直以为这次比赛public和private排名会相差不大&#xff0c;结果前6有4个人都是从银牌歘一下上来的&#xff0c;想象地到他们看到结果时的喜悦