传送门

题目大意:

给一个序列,可以在这个序列中从左至右选若干个段,第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即为答案。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. typedef pair<int, int>PII;
  5. #define INF 0x3f3f3f3f3f3f3f3f
  6. #define inf 0x3f3f3f3f
  7. #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  8. #pragma warning(disable:4996)
  9. const int maxn = 101010;
  10. LL T, N, A[maxn], S[maxn];
  11. LL dp[maxn][510];//从Ai个到第An个数中可以取j段满足条件时能达到的第一段sum的最大值
  12. void solve()
  13. {
  14. for (int i = 1; i <= N; i++)
  15. S[i] = S[i - 1] + A[i];
  16. for (int i = 0; i <= N + 1000; i++)
  17. {
  18. for (int j = 0; j <= int(sqrt((N + 1) * 2)); j++)
  19. dp[i][j] = -INF;
  20. }
  21. int ans = 1;
  22. dp[N][1] = A[N];
  23. for (int i = N - 1; i > 0; i--)
  24. {
  25. dp[i][1] = max(dp[i + 1][1], A[i]);
  26. for (int j = 2; j <= int(sqrt((N + 1)*2)); j++)
  27. {
  28. dp[i][j] = dp[i + 1][j];
  29. LL sum = S[i + j - 1] - S[i - 1];
  30. if (dp[i + j][j - 1] > 0 && sum < dp[i + j][j - 1])
  31. dp[i][j] = max(dp[i][j], sum);
  32. // cout << i << "-" << j << ":::::" << dp[i][j] << endl;
  33. }
  34. }
  35. for (int j = 2; j <= int(sqrt((N + 1) * 2)); j++)
  36. {
  37. if (dp[1][j] > 0)
  38. ans = j;
  39. }
  40. cout << ans << endl;
  41. }
  42. int main()
  43. {
  44. IOS;
  45. cin >> T;
  46. while (T--)
  47. {
  48. cin >> N;
  49. for (int i = 1; i <= N; i++)
  50. cin >> A[i];
  51. solve();
  52. }
  53. return 0;
  54. }

Codeforces Round #750 (Div. 2) E. Pchelyonok and Segments的更多相关文章

  1. Codeforces Round #750 (Div. 2)

    Codeforces Round #750 (Div. 2) A. Luntik and Concerts 思路分析: 首先我们可以肯定的是a,b,c都大于等于1,所以我们先让它们自己抵消自己,最后a ...

  2. 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 ...

  3. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  4. 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 ...

  5. Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)

    https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...

  6. 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 ...

  7. 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 ...

  8. 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 题意 ...

  9. Codeforces Round #453 (Div. 1) 901C C. Bipartite Segments

    题 http://codeforces.com/contest/901/problem/C codeforces 901C 解 首先因为图中没有偶数长度的环,所以: 1.图中的环长度全是奇数,也就是说 ...

随机推荐

  1. 多线程-创建线程第二种方式-实现Runnable接口-细节和好处

    1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...

  2. 使用AJAX请求调用出现HTTPS协议错误问题

    前言: 这又是一个可能是半路就卡机的项目,在调用ajax的时候遇到了下面的这个错. js中有个ajax请求http,url是:http//:.js就提示请求了一个不安全的脚本,在发送ajax请求时,就 ...

  3. 使用光盘无网络搭建本地yum源仓库

    目录 一:使用光盘搭建本地yum源 1,按顺序搭建本地yum源 第一步 : 搭载安装光盘 第二步 : 编辑repo yum源文件 第三步 : 检查 yum makecache 注意事项: 一:使用光盘 ...

  4. 利用Jemalloc进行内存泄漏的调试

    内存不符预期的不断上涨,可能的原因是内存泄漏,例如new出来的对象未进行delete就重新进行复制,使得之前分配的内存块被悬空,应用程序没办法访问到那部分内存,并且也没有办法释放:在C++中,STL容 ...

  5. 如何使用 numpy 和 pytorch 快速计算 IOU

    前言 在目标检测中用交并比(Interection-over-unio,简称 IOU)来衡量两个边界框之间的重叠程度,下面就使用 numpy 和 pytorch 两种框架的矢量计算方式来快速计算各种情 ...

  6. django入门 01 创建项目

    安装django库 pip install django 创建--by 终端 django-admin startproject myproject 通过命令创建的django项目,默认不含templ ...

  7. IDE中集成widfly

    第一步:添加JBOss服务器,Tomcat同理添加 第二步:选择刚刚部署好的服务器 第三步:启动服务: 注意:与Tomcat略有不同的是,启动的根目录可能不相同,导致一直404 查看启动的根目录: 注 ...

  8. PHP获取日期和时间:

    转载请注明来源:https://www.cnblogs.com/hookjc/ 使用函式 date() 实现 <?php echo $showtime=date("Y-m-d H:i: ...

  9. Servlet Servlet的装载三种情况

    感谢原文作者:DaleyDC 原文链接:https://blog.csdn.net/sinat_32873711/article/details/53170342 Servlet的装载三种情况: 自动 ...

  10. @play.data.binding.NoBinding

    新的@play.data.binding.NoBinding注解允许我们定义一些"不应该被绑定"的字段,以防出现安全问题.例如: public class User extends ...