D. The Best Vacation(贪心+前缀和+二分)
The Best Vacation
思路
前缀和加贪心
贪心:我们的结尾点一定是在某一个月的最后一天。
贪心部分证明:我们选定两组数
A=an−2,an−1,an,b1,b2,b3……bn−2,bn−1A = a_{n - 2}, a_{n - 1}, a_{n}, b_{1}, b_{2}, b_{3}……b_{n - 2}, b_{n - 1}A=an−2,an−1,an,b1,b2,b3……bn−2,bn−1
B=an−1,an,b1,b2,b3……bn−2,bn−1,bnB = a_{n - 1}, a_{n}, b_{1}, b_{2}, b_{3}……b_{n - 2}, b_{n - 1}, b_{n}B=an−1,an,b1,b2,b3……bn−2,bn−1,bn
假如我们的贪心策略是正确的,只需要证明bn>an−2b_{n} > a_{n - 2}bn>an−2即可,但是我们总能如愿吗,看一组样例。
2 4
5 21 2 3 4 5 1 2chose 3 4 5 1
chose 4 5 1 2显然这里贪心策略错了
ans 2 3 4 5
但是我们能看到的是这组样例的却也是以某一个月的最后一天结尾。
我们列出a,ba, ba,b两个月的每天来。
a1,a2,a3,……,an−2,an−1,ana_{1}, a_{2}, a_{3}, ……, a_{n - 2}, a_{n - 1}, a_{n}a1,a2,a3,……,an−2,an−1,an
b1,b2,b3,……,bn−2,bn−1,bnb_{1}, b_{2}, b_{3}, ……, b_{n - 2}, b_{n - 1}, b_{n}b1,b2,b3,……,bn−2,bn−1,bn
假如bn>an−2b_{n} > a_{n - 2}bn>an−2,我们选定的两组数是一定成立的。
或者bn<an−2b_{n} < a_{n - 2}bn<an−2,同样的我们可以得到eachifrom1ton,an−i−1>bn−i+1each\ i\ from\ 1\ to\ n,a_{n - i - 1} > b_{n - i + 1}each i from 1 to n,an−i−1>bn−i+1
这里我们证明得到在上一步的贪心中,以月份aaa结尾的是正确的,否则的话我们将得到以bbb结尾的是正确的。
由此我们的贪心策略是正确的,所以我们只需要用前缀和来维护,然后通过枚举结尾点就行了。
代码
#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int N = 4e5 + 10;ll a[N], s[N], x;
int n;int main() {freopen("in.txt", "r", stdin);ios::sync_with_stdio(false);cin >> n >> x;for(int i = 1; i <= n; i++) {cin >> a[i];a[i + n] = a[i];s[i] = s[i + n] = (1 + a[i]) * a[i] / 2;}for(int i = 1; i <= n << 1; i++) a[i] += a[i - 1], s[i] += s[i - 1];ll ans = 0;for(int i = 1; i <= 2 * n; i++) {if(a[i] < x) continue;ll low = a[i] - x;int p = lower_bound(a + 1, a + 1 + 2 * n, low) - a;if(a[i] - a[p] == x) ans = max(ans, s[i] - s[p]);else {ll last = low - a[p - 1];ans = max(ans, s[i] - s[p - 1] - (1 + last) * last / 2);}}cout << ans << "\n";return 0;
}
D. The Best Vacation(贪心+前缀和+二分)相关推荐
- HDU 6406 Taotao Picks Apples(前缀和+二分)
HDU 6406 Taotao Picks Apples(前缀和+二分) Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- poj3061尺取法/前缀和 二分(java)
今天遇到这题因为以前没见到过,当时就是想着应该有着一个很简单的方法可以过但是奈何就是没思路.后来看了别人思路写了下来.学习了尺取法 poj3061 题目介绍: Description A sequen ...
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- LeetCode 528. 按权重随机选择(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 ...
- LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)
文章目录 1. 题目 2. 解题 1. 题目 给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点. 提示: 整数点是具有整数坐标的点. 矩形周边上 ...
- 均分纸牌问题——(分治 + 贪心 + 前缀和 + 中位数 + 排序)
题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七 ...
- Glider(前缀和+二分)
题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...
- 209 长度最小的子数组(前缀和+二分查找、滑动窗口)
1. 问题描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = ...
- leetcode:1838. 最高频元素的频数【排序 + 前缀和 + 二分 + 思维】
分析 由于只能通过加得到某个频数 因为求的是频数,所以二分频数 频数也作为自变量,而最少操作次数成为了因变量 问题的关键就是在给定频数的情况下,求出最少操作数 因为频数越大的话,最少操作数肯定是越大的 ...
最新文章
- dz mysql日志清理_Discuz教程:如何准确的清理数据库
- python学习(字典、用户输入和while循环)
- 我是如何学习写一个操作系统(六):进程的调度
- 动态规划——双11既可以薅羊毛还能花钱最少
- Redis:05---键的基本命令(下) 生存周期
- Java中的Switch都支持String了,为什么不支持long?
- MySQL-MySQL数据类型及占用字节数
- python内置函数__import__
- JSF是什么?它与Struts是什么关系?
- [Usaco2014 Open]Gold Fair Photography(hash)
- PHP如何在照片下面写一行字_如何使用php分别插入照片和文字?
- Javascript特效:图片切换(类似于电商网站图片查看)的封装实现和闭包实现
- 1.1 《数据库系统概论》之数据库系统概述(数据、数据库、数据库管理系统、数据库系统、数据库的产生和发展)
- python卡方拟合优度检验_SPSS超详细教程:卡方拟合优度检验
- 智能问答机器人python_帮帮智能问答机器人中TaskBot任务对话算法实践
- 控制器同变频器建立modbus RTU通信小结
- 国际音标 英式音标 美式音标
- POJ-2184 Cow Exhibition---01背包变形(负数偏移)
- 用Photoshop将照片卡通化
- 玩转这些视频制作软件,让你成为短视频高手
热门文章
- 潜入水下后,水越深,受周围的挤压力越大...
- 趁爸妈不在家约男朋友回家吃饭,然而......
- 博导眼里本科生的科研能力:“他们还在玩泥巴”
- 看OpenCV如何在python中实现图像检测!
- 那些把天聊死的神操作。。| 今日最佳
- 21张GIF动图让你秒懂数学原理
- Google第一女神李飞飞,从洗碗工蜕变成为首席科学家
- 资料分享 | R语言资料分享来袭
- 干货|吴恩达Coursera课程教你学习神经网络!
- 什么是python扩展库_什么是目前比较常用的Python扩展库管理工具