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.hqwc.cn/news/189624.html

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

相关文章

前置语音群呼与语音机器人群呼哪个更好

最近通过观察自己接到的营销电话&#xff0c;通过语音机器人外呼的量应该有所下降。同时和客户交流获取到的信息&#xff0c;也是和这个情况类似&#xff0c;很多AI机器人群呼的量转向了OKCC前置语音群呼。询问原因&#xff0c;说是前置语音群呼转化更快&#xff0c;AI机器人群…

Vite Vue3+Element Plus框架布局

App根组件&#xff1a;框架布局 <template><el-container class"layout-container-demo" style"height: 98vh"><!-- 菜单栏 --><el-aside width"200px"><el-scrollbar><!-- router:是否启用 vue-router 模式。…

HTTP Error 500.31 - Failed to load ASP.NET Core runtime

在winserver服务器上部署net6应用后&#xff0c;访问接口得到以下提示&#xff1a; 原因是因为没有安装net6的运行时和环境&#xff0c;我们可以在windows自带的 “事件查看器” 查看原因。 可以直接根据给出的地址去官网下载sdk环境&#xff0c;安装即可 下载对应的net版本…

C++菜鸟日记2

关于getline()函数&#xff0c;在char和string输入的区别 参考博客 1.在char中的使用&#xff1a; 2.在string中的使用&#xff1a; 关于char字符数组拼接和string字符串拼接方法 参考博客 字符串拼接方法&#xff1a; 1.直接用 号 2.利用append&#xff08;&#xff0…

Windows11怎样投屏到电视上?

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

聚观早报 |零跑C10亮相广州车展;小鹏X9亮相广州车展

【聚观365】11月18日消息 零跑C10亮相广州车展 小鹏X9亮相广州车展 坦克700 Hi4-T开启预售 超A级家轿五菱星光正式预售 哪吒汽车发布山海平台2.0 零跑C10亮相广州车展 零跑汽车首款全球车型C10在广州车展首次亮相&#xff0c;同时该车也是零跑LEAP 3.0技术架构下的首款全…

【Hello Go】Go语言复合类型

复合类型 分类指针基本操作new函数指针作为函数的参数 数组概述操作数据数组初始化数组比较在函数之间传递数组 slice概述切片的创建和初始化切片操作切片和底层数组关系内建函数appendcopy 切片作为函数传参 map概述创建和初始化常用操作赋值遍历 删除map作函数参数 结构体结构…

阿里云服务器 手动搭建WordPress(CentOS 8)

前提条件 已创建Linux操作系统的ECS实例&#xff0c;并且手动部署LNMP环境&#xff0c;具体操作&#xff0c;请参见手动部署LNMP环境&#xff08;CentOS 8&#xff09;。本教程使用的相关资源版本如下。 实例规格&#xff1a;ecs.c6.large 操作系统&#xff1a;公共镜像CentO…

数据同步策略解读

前言 我们都知道在大多数情况下&#xff0c;通过浏览器查询到的数据都是缓存数据&#xff0c;如果缓存数据与数据库的数据存在较大差异的话&#xff0c;可能会产生比较严重的后果的。对此&#xff0c;我们应该也必须保证数据库数据、缓存数据的一致性&#xff0c;也就是就是缓…

windows安装wsl2以及ubuntu

查看自己系统的版本 必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 才能使用以下命令 在设置&#xff0c;系统里面就能看到 开启windows功能 直接winQ搜 开启hyber-V、使用于Linux的Windows子系统、虚拟机平…

三次握手和四次握手到底有啥区别?

1. 三次握手 TCP 协议中&#xff0c;在发送数据的准备阶段&#xff0c;客户端与服务器之间的三次交互&#xff0c;以保 证连接的可靠。 • 第一次握手&#xff0c;客户端向服务器端发起 TCP 连接的请求• 第二次握手&#xff0c;服务器端发送针对客户端 TCP 连接请求的确认•…

【mysql】1153 - Got a packet bigger than ‘max_allowed_packet‘ bytes

执行mysql 语句出现&#xff1a;1153 - Got a packet bigger than max_allowed_packet bytes&#xff1b; 1153-得到一个大于“max_allowed_packet”字节的数据包。 数据包太大了怎么办。该配置吧。 查看max_allowed_packet show global variables like max_allowed_packet;…