Codeforces Round #750 (Div. 2) E. Pchelyonok and Segments
题目大意:
给一个序列,可以在这个序列中从左至右选若干个段,第i段的长度为i,对于任意的段i,段内元素和S[i]<S[i+1],求在该序列中最多可以选出几段。
思路:设dp[i][j]为从Ai个到第An个数中可以取j段满足条件时能达到的第一段sum的最大值
我们从后往前dp,一开始dp[N][1]=A[N],其他初始为0,当j=1时,显然有,dp[i][1]=max(A[i],dp[i+1][1])。
对于其他情况,设sum=A[i]+A[i+1]+...+A[i+j-1],如果dp[i+j][j-1] > 0 且 sum < dp[i+j][j-1](为了满足段的和必须递增,以及从A[i+j]开始取可以取j-1段),那么dp[i][j]=max(dp[i+1][j],sum),否则,dp[i][j]=dp[i+1][j]。
最后遍历所有dp[1][j],dp[1][j] > 0时即第一段和>0,说明可以取j段,最大的使dp[1][j] > 0的j即为答案。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable:4996)
const int maxn = 101010;
LL T, N, A[maxn], S[maxn];
LL dp[maxn][510];//从Ai个到第An个数中可以取j段满足条件时能达到的第一段sum的最大值
void solve()
{
for (int i = 1; i <= N; i++)
S[i] = S[i - 1] + A[i];
for (int i = 0; i <= N + 1000; i++)
{
for (int j = 0; j <= int(sqrt((N + 1) * 2)); j++)
dp[i][j] = -INF;
}
int ans = 1;
dp[N][1] = A[N];
for (int i = N - 1; i > 0; i--)
{
dp[i][1] = max(dp[i + 1][1], A[i]);
for (int j = 2; j <= int(sqrt((N + 1)*2)); j++)
{
dp[i][j] = dp[i + 1][j];
LL sum = S[i + j - 1] - S[i - 1];
if (dp[i + j][j - 1] > 0 && sum < dp[i + j][j - 1])
dp[i][j] = max(dp[i][j], sum);
// cout << i << "-" << j << ":::::" << dp[i][j] << endl;
}
}
for (int j = 2; j <= int(sqrt((N + 1) * 2)); j++)
{
if (dp[1][j] > 0)
ans = j;
}
cout << ans << endl;
}
int main()
{
IOS;
cin >> T;
while (T--)
{
cin >> N;
for (int i = 1; i <= N; i++)
cin >> A[i];
solve();
}
return 0;
}
Codeforces Round #750 (Div. 2) E. Pchelyonok and Segments的更多相关文章
- Codeforces Round #750 (Div. 2)
Codeforces Round #750 (Div. 2) A. Luntik and Concerts 思路分析: 首先我们可以肯定的是a,b,c都大于等于1,所以我们先让它们自己抵消自己,最后a ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- Codeforces Round #524 (Div. 2) F. Katya and Segments Sets(主席树)
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b ...
- Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...
- Codeforces Round #245 (Div. 2) A. Points and Segments (easy) 贪心
A. Points and Segments (easy) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...
- Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...
- CodeForces -Codeforces Round #496 (Div. 3) E2. Median on Segments (General Case Edition)
参考:http://www.cnblogs.com/widsom/p/9290269.html 传送门:http://codeforces.com/contest/1005/problem/E2 题意 ...
- Codeforces Round #453 (Div. 1) 901C C. Bipartite Segments
题 http://codeforces.com/contest/901/problem/C codeforces 901C 解 首先因为图中没有偶数长度的环,所以: 1.图中的环长度全是奇数,也就是说 ...
随机推荐
- 学习JAVAWEB 第三十六天
今天改了一天的bug 使用eclipse出现的问题:首先lib文件夹的名字是不可以更改的它放在WEB-INF文件夹下,放所有的jar包,使用时一定不要忘了将jar包添加至构建路径tomcat的部署问题 ...
- 学习Java第14天
今天成功安装了MySQL Visual Studio Code 准备试着学习HTML+CSS了 明天开始认识HTML和CSS学会软件的使用 今天安装调试这些东西属实费了点劲,可能电脑配置较低吧,还有点 ...
- 码风QwQ
注:卡常.压行时怎么有效怎么来QwQ 快读真香.( 不喜欢用字符数组,使用string. 此时cin cout输入前会加这样三句以优化: ios::sync_with_stdio(0); cin.ti ...
- vue 快速入门 系列 —— Vue 实例的初始化过程
其他章节请看: vue 快速入门 系列 Vue 实例的初始化过程 书接上文,每次调用 new Vue() 都会执行 Vue.prototype._init() 方法.倘若你看过 jQuery 的源码, ...
- 一 简单介绍aws。
aws入门 一 什么是aws? /* 概念: AWS就是 Amazon Web Servies, 亚马逊云计算服务平台. 是一款云服务. */ 二 aws可以做什么? // 可以在aws,创建我们需要 ...
- What Goes Up Must Come Down
跳转链接 题目描述 给定一个序列, 求出将此序列变换为单调递增.单调递减 或者先增后减 样例1 输入 7 3 1 4 1 5 9 2 输出 3 样例2 输入 9 10 4 6 3 15 9 1 1 1 ...
- 从我做起[原生DI实现模块化和批量注入].Net Core 之一
实现模块化注册 .Net Core实现模块化批量注入 我将新建一个项目从头开始项目名称Sukt.Core. 该项目分层如下: Sukt.Core.API 为前端提供APi接口(里面尽量不存在业务逻辑, ...
- AQS源码一窥-JUC系列
AQS源码一窥 考虑到AQS的代码量较大,涉及信息量也较多,计划是先使用较常用的ReentrantLock使用代码对AQS源码进行一个分析,一窥内部实现,然后再全面分析完AQS,最后把以它为基础的同步 ...
- JVM学习十 -(复习)内存分配与回收策略
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...
- NSString基本概念
1.NSString基本概念 什么是NSString? 一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类 2.NSString创建方式 最直接的方式(常量字符串) ...