题目:

给定一个序列,从序列中选出几组连续不相交的区间,要求这几个区间中的数加起来一样大,问最多可以选出多少个区间。
(1≤N≤1500)(1\leq N\leq 1500)(1≤N≤1500)


思路:

比赛的时候看到这题,直接就想到 DPDPDP 上去了… 但是实在没办法 DPDPDP,然后自闭了…

很容易想到处理所有不同的区间和,然后对于每一个区间和再进行处理。因为最多只有 n2n^2n2 个不同的区间和,即最多 1e61e61e6 个不同的区间和,所以我们可以对于每个区间和进行处理。我也就是想到这里,然后转向了 DPDPDP …

正解是对于每个区间和,处理出这个区间和对应的多个区间,然后问题就变成了经典的选课问题。现在有 nnn 门课程,每门课程覆盖了一段时间,每个时间段只能上一门课,问最多可以选几门课。所以按照右端点排序,直接贪心即可。


反思:

DPDPDP 和贪心有的时候会难以区分,导致错失正解。DPDPDP 的本质其实是搜索,是对暴搜的剪枝,去除了大量不正确的情况,通常来说列出了 DPDPDP 方程之后,DPDPDP 正确性也就随之证明了。但是对于贪心来说,很多时候还是停留在试试的阶段,对贪心的掌握还是很差。

贪心通俗来说,就是一种在每次决策时采取当前意义下最优策略的算法,因此贪心要求问题的整体最优性可以由局部的最优性导出,但是贪心的正确性其实并不好证明。通常采取微扰法进行证明,即邻项交换。证明在任意局面下,任何对局面最优策略的微小改变都会造成整体结果变差。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 2000;int a[N],sum[N],n,tot;
map<int,int> mp;
vector<pair<int,int> > v[N*N];int solve(int x){int tp = 0, last = 0;sort(v[x].begin(),v[x].end());rep(i,0,v[x].size()-1){if(v[x][i].second > last) tp++, last = v[x][i].first;}return tp;
}void output(int x)
{if(x == -1) return;int last = 0;sort(v[x].begin(),v[x].end());rep(i,0,v[x].size()-1){if(v[x][i].second > last) {last = v[x][i].first;printf("%d %d\n",v[x][i].second,v[x][i].first);}}
}int main()
{mp.clear(); tot = 0;scanf("%d",&n);rep(i,1,n){scanf("%d",&a[i]);sum[i] = sum[i-1]+a[i];}rep(i,0,n-1)rep(j,i+1,n){int tp = sum[j]-sum[i];if(mp.find(tp) == mp.end()) mp[tp] = ++tot;int pos = mp[tp];v[pos].push_back(make_pair(j,i+1));}int ans = 0, tph = -1;rep(i,1,tot){int tmp = solve(i);if(tmp > ans){ans = tmp, tph = i;}}printf("%d\n",ans);output(tph);return 0;
}

【 Codeforces Round #547 (Div. 3) F2】Same Sum Blocks (Hard)【思维贪心】相关推荐

  1. Codeforces Round #742 (Div. 2) D. Expression Evaluation Error(思维 + 贪心)

    链接 D. Expression Evaluation Error 题意 给出一个十进制数 s s s,分成 n n n 个数,这 n n n 个数十进制和为 s s s,要让 n n n个数十一进制 ...

  2. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树

    传送门 文章目录 题意: 思路: 题意: 比如下面这个图: 思路: 对于这个题,比较容易就能考虑到dpdpdp,设f[i][j]f[i][j]f[i][j]为到了第iii行,覆盖了[j,j+k−1][ ...

  3. Codeforces Round #579 (Div. 3) F2. Complete the Projects (hard version) dp + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 排序方式跟easyeasyeasy版本的一样,但是hardhardhard版本是输出最多能选多少,所以我们对b<0b<0b<0的情况 ...

  4. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

    传送门 文章目录 题意: 思路: 题意: 有nnn个人,每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​,当他会第xxx个技能的时候,aia_iai​的第xxx位是111.定义当xx ...

  5. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给定一个长度为nnn的序列aaa,定义一段区间为好区间是这段区间的所有连续子区间的和都不为000,求好区间的个数. 思路: 套路题,定义aia_iai​的前缀 ...

  6. Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造

    传送门 文章目录 题意: 思路: 题意: 给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd. n,d≤3000n,d\le 3000n,d≤3000. 思路: 先考虑不 ...

  7. Codeforces Round #167 (Div. 1) C. Dima and Horses(BFS+贪心)

    题目大意 有 n(1≤n≤3*105) 匹马,每条马都有几个敌人(不超过 3 个),现在要求把这些马分成两部分(允许一部分中没有一条马),使得对于每条马,和它在同一部分中的敌人的数量不超过1个 给出了 ...

  8. Codeforces Round #732 (Div. 2) C. AquaMoon and Strange Sort 思维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每个数初始方向是向右,每次可以交换相邻两个位置并且将这两个位置的方向调换,问这个序列的最终状态能否是非递减且方向都向右. n≤1e5,ai≤1 ...

  9. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  10. Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的串sss,你有两个操作可以使用: (1)(1)(1)从sss的结尾删除一个字母. (2)s=s+s(2)s=s+s(2)s=s+s. 让 ...

最新文章

  1. 写给将要参加软考的朋友们
  2. 【Jekyll搭建GITHUB个人博客】安装Ruby 环境、包管理器 RubyGems、Jekyll与错误解决...
  3. 分布式锁(Redisson)-从零开始,深入理解与不断优化
  4. 第2本书:CCIE Practical Studies, Volume II-第5天
  5. JS实现禁止浏览器后退返回上一页
  6. asp.net尚未在web服务器上注册_最新版Web服务器项目详解 00 项目概述
  7. 黄聪:电子商务关键数字优化(线上部分,上)
  8. Python爬虫入门教程 46-100 Charles抓取手机收音机-手机APP爬虫部分
  9. Dilated Convolution(空洞卷积、膨胀卷积)详解
  10. PHP第一季视频教程.李炎恢.学习笔记(二)(第2章 基本语法(1))
  11. IIS提示您未被授权查看该页 401.1解决办法
  12. 翟菜花:她经济的营销攻坚战,4C的用户导向才是破局之法
  13. 历史上的今天mysql数据库包含详情分类以及图片(免费分享)
  14. HTML5讲解与演示转载整理
  15. Matter理论介绍-通用-1-04:桥接器-其他功能
  16. 怒揭黑莓市场黑幕,还消费者公道
  17. x平方检验计算_卡方检验具体怎么计算
  18. 【PP系列】SAP PP模块工作中心主数据维护
  19. 用python画枫叶-python-函数及练习
  20. 拒绝访问html,为什么IE常常出现拒绝访问 ie拒绝访问的原因及解决方法

热门文章

  1. Android屏幕尺寸(来自网络整理)
  2. 如何让普通用户执行一些root用户才能执行的命令
  3. android rfid 数据解析_基于RFID技术的标签数据完整性与安全性解析
  4. SSM俱乐部商城 俱乐部官网商城
  5. qpython能使用json吗l_现在还能使用土墙吗?
  6. python中new方法详解及_Python中__new__与__init__方法的区别详解
  7. mysql 慢日志 逻辑读_学会读懂 MySql 的慢查询日志
  8. 前端保存之前输入的值_前端基础进阶(一):内存空间详细图解
  9. linux怎么编译python_linux 编译安装python3
  10. cordova与android通信_使用Cordova插件实现两个app之间的相互调用和通讯