【CF 460C】Present
2015-08-16 21:13
225 查看
【CF 460C】Present
二分+贪心 二分最矮高度的最大值 每二分一个遍历看是否可达 可达low = mid+1不可达high = mid-1 可达的判断用贪心即可 改点长度不足时 在改点设置浇水点 同是在i+w设置断水 之后每个点都继承前一个点的浇水量 到i+w时减少i处浇的水即可
代码如下:
二分+贪心 二分最矮高度的最大值 每二分一个遍历看是否可达 可达low = mid+1不可达high = mid-1 可达的判断用贪心即可 改点长度不足时 在改点设置浇水点 同是在i+w设置断水 之后每个点都继承前一个点的浇水量 到i+w时减少i处浇的水即可
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #define sz 100000 #define ll long long using namespace std; int a[sz+2]; int dis[sz+2]; int n,m,w; bool can(int x) { memset(dis,0,sizeof(dis)); int i,p,hs = m; for(i = 1; i <= n; ++i) { dis[i] += a[i]+dis[i-1]-a[i-1];//dis[i-1]-a[i-1]继承前一点浇水量 用+=是为了即使断水 p = x-dis[i]; if(p > 0) { if(p > hs) return false;//当前水量不足返回false hs -= p; dis[i] += p;//设浇水点 if(i+w <= n) dis[i+w] -= p;//设断水点 防越界加个if } } return true; } int main() { int i,l,r,mm,mid,ans; scanf("%d %d %d",&n,&m,&w); mm = 0; a[0] = 0; for(i = 1; i <= n; ++i) { scanf("%d",&a[i]); mm = max(mm,a[i]); } l = 1,r = mm+m;//优化一下右界 加快 while(l <= r) { mid = (l+r)>>1; if(can(mid)) { ans = mid; l = mid+1; }else r = mid-1; } printf("%d\n",ans); return 0; }
相关文章推荐
- Light Bulb 三分入门题
- 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town
- iPhone手机屏幕的尺寸
- poj1321c语言棋盘简单深搜
- python 点滴记录15:MAC OS安装MySQLdb
- Spring学习笔记-springMVC基于注解的控制器(基本概念)
- Unix 网络编程基础----网络字节序(大端小端)
- java对象引用和值引用,特殊的String!
- 08 条件和循环 - 《Python 核心编程》
- LVS + KEEPALIVED + WINDOWS SERVER 2008 R2 ------高可用负载均衡
- iOS开发_概述和程序的执行顺序
- 经典语录
- 366 D的小L
- 基本粒子群优化算法(PSO)的matlab实现
- iOS学习(自定义button)
- 网络编程TCP(六)
- lr_save_string函数的作用-订飞机票的例子-把变量或者常量存入参数以供脚本使用
- jquery自己主动旋转的登录界面的背景代码登录页背景图
- POJ 2104 K-th Number
- Android的回调