Codeforces469div2F curfew(贪心)
题意:
- 有n间宿舍实施宵禁:
- 1.一个舍监从1走向n,另一个舍监从n走向1
- 2每个宿舍有a[i]a[i]a[i]个学生,且∑ni=1a[i]=n∗b∑i=1na[i]=n∗b\sum_{i=1}^n a[i]=n*b
- 3舍监走到某个宿舍前,未上锁宿舍的学生可以走到距离当前宿舍不超过d的宿舍
- 4舍监查某个宿舍时,如果宿舍人数<b<b<script type="math/tex" id="MathJax-Element-1197">
- 5所有宿舍上锁,结束
- 6如果n是奇数,第n/2+1n/2+1n/2+1个宿舍归第一个舍监查
想法:
- 首先如果i<a<b<ji<a<b<ji那么只会a向i走,b向j走,不会a向j走时,b向i走
- 所以宿舍中会有一道分界线,一部分往左走,一部分往右走
- 假设只有左边一个舍监
- 那么查到第i个舍监时,如果能把一部分人调过来使a[i]⩾ba[i]⩾ba[i] \geqslant b那就把那部分人调过来使得a[i]=ba[i]=ba[i]=b,否则就令该宿舍所有人去第i+1间宿舍
- 判断即sum[i∗d]−cnt∗b⩾bsum[i∗d]−cnt∗b⩾bsum[i*d]-cnt*b\geqslant b,cnt为前面宿舍人数=b=b=b的个数
- 令l=i∗d,r=n−i∗d,mid=n/2l=i∗d,r=n−i∗d,mid=n/2l=i*d,r=n-i*d,mid=n/2
- 如果l<rl<rl,那么1~l的人都尽力满足第i间,r~n的人满足第n-i+1间
- 如果r<lr<lr呢,r~l这部分人往哪跑
- 注意条件∑ni=1a[i]=n∗b∑i=1na[i]=n∗b\sum_{i=1}^n a[i]=n*b
- 加入让mid~l这部分人往i跑,似乎会令右边的cnt1−−cnt1−−cnt1--,
- 但跑的情况是因为sum[mid]<=b∗cnt+bsum[mid]<=b∗cnt+bsum[mid],因为cnt<=midcnt<=midcnt,所以sum[mid]<=b∗midsum[mid]<=b∗midsum[mid]
- 所以sum[n]−sum[mid]>=mid∗bsum[n]−sum[mid]>=mid∗bsum[n]-sum[mid]>=mid*b,所以右边那部分人对付第二个舍监绰绰有余
- 所以直接贪心
- 如果n是奇数,那么第n/2+1n/2+1n/2+1间宿舍肯定可以满足
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll long long
#define fo(i,a,b) for(i=a;i<=b;i++)
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const ll maxN=1e5+10;
ll n,d,k,a[maxN],sum[maxN],cnt1,cnt,b,i,ans,x;
int main(){//freopen("a.in","r",stdin); scanf("%I64d%I64d%I64d",&n,&d,&b);fo(i,1,n) scanf("%I64d",&a[i]),sum[i]=sum[i-1]+a[i];fo(i,1,n/2){x=sum[min(n,i*d+i)]-cnt*b;if (x>=b) cnt++;x=sum[n]-sum[max(n-i*d-i,0)]-cnt1*b;if (x>=b) cnt1++;}ans=n/2-min(cnt,cnt1);printf("%I64d",ans);
}
Codeforces469div2F curfew(贪心)相关推荐
- 【CF949D】Curfew(贪心)
[CF949D]Curfew(贪心) 题面 CF 洛谷 破池姐姐翻译好强啊 题解 今天菊开讲这题,我大力猜想一波说肯定从中间有个分界线,他还说可能是假的 大力贪心就好了,从两边往中间考虑,只要这个房间 ...
- 算法设计与分析第3章 贪心算法
第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- Too Many Segments CF595D 贪心乱搞
传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...
- Roundgod and Milk Tea 贪心
这个题好像可以用一种类似与置换的贪心方法来做~ sum记为剩余奶茶,一开始sum等于奶茶和 ans记录已经喝的奶茶数 不用排序,我们就从前往后直接处理,考虑的是每一个班最多可以喝多少杯奶茶 就是从剩余 ...
- 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...
- 贪心:expedition 最优加油方法
已知一条公路上,有一个起点与一个终点,这之间有n个加油站;已知从这n个加 油站到终点的距离d与各个加油站可以加油的量l,起点位置至终点的距离L与起 始时刻油箱中汽油量P;假设使用1个单位的汽油即走1个 ...
- 贪心:Burst Balloons 最少次数完成射击气球
已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...
- 贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少 ...
- 贪心:Jump Game 跳跃游戏
一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回是t ...
最新文章
- _vsnprintf 用法
- 中国科学家提出“探索极端宇宙”国际科学计划
- nginx 一个请求发给多台机器_一个机器人可以同时为多台数控机床上下料吗?东智力衡...
- Spring Rdbms操作(二)——SqlFunction 获取表数据条数
- JavaSE----代码块、内部类
- 纯新手DSP编程--5.21--RTDX
- 利用ExcelJS读取Excel文件
- opencv codebook
- ubuntu固定内网ip_Ubuntu 设置固定ip地址
- IT行业市场人才需求
- Websphere9.0的安装
- Alienware-17-R4-630-1060-MacOS 笔记本双显卡 外星人黑苹果hackintosh 10.15
- H5唤起web地图导航
- python中mod是什么意思_【python中,mod_python到底做了些什么呢?】mod python 教程
- 安卓仿陌陌用户详情页轮播图联动效果
- JetBrains全家桶(IDEA、Pycharm等各个产品)在国内高速下载地址
- 外边距 - margin
- Atcoder Codefestival Exhibition/Team Relay/Tournament Round 简要题解
- OWL操盘主图可视化解读
- 使用树莓派定时给微信群发消息