题目链接:http://codeforces.com/submissions/ywindysai

题目意思:有 n 朵花,每朵花都有一定的高度(第 i 朵花对应 ai),m 天之后要把这些花送给别人。不过这 m 天里可以通过淋花来让花长得尽可能高啦(当然不希望把长得矮矮的花送给人啦),每天只能淋一次,一次覆盖的范围是连续的 w 朵,淋完水后被淋的花会在当天长高 1 个单位(one height unit)。现在就问,m天之后,最矮的那朵花最高能长到多高。

首先,我对这条题目完全没有想法,四个字:无从下手!好啦,直接看题解,英文太差,有些地方看不懂,直接看代码,还是有点不懂,手动模拟终于明白了^_^

总体的思路就是:二分找出这个高度!(姑且说它为期望值X)。计算出这 n 朵花是否每朵都能够在这 m 天内长到X 那么高。怎么找是一个关键。假设花从左到右是从0~n-1编号的。

对于每个期望值X(二分,使得即使X好大,也只是O(log2N),N 最大为1e14(10^5 × 10^9)),我们都要按顺序遍历这 n 朵花(在我看来,按顺序来做确实可以化繁为简,将问题简单化)。首先对于前 w 多花,它们都不能借助前面花的淋水次数来减少它们被淋的次数(通过段来减少,就是w 啦),因为它们是最先嘛。那么第一朵花得到期望值X要淋X-a[0] 天了,而接下来连续的w-1朵就可以少淋 X-a[0] 这么多天了,而且这w-1朵可以在原来的高度下长高X-a[0] 的高度。不过w-1朵之后的花就不能依靠第一朵花被淋的次数了(只能覆盖w段),不过对于 i (i >= w)的每朵花,它可以依靠i-1, i-2,...,i-w 朵花被淋的次数来长高相应高度,这样往往可以使得当第 i 朵花要到达期望值时的淋水天数少于它本来最多要淋的次数(X - a[i])

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std; typedef long long ll;
const ll maxn = 1e14; vector<ll> a;
ll m, w, n; bool check(ll x)
{
ll move = ;
ll scur = ;
vector<ll> s(n+, ); // s 的 n+1个元素初始值都为0
for (ll i = ; i < n; i++)
{
scur -= (i >= w ? s[i-w] : ); // 刚开始的w-1朵花不能依靠前面花的被淋天数来增高,之后的都可以
if (x > a[i] + scur)
{
s[i] = x - scur- a[i]; // 第i朵花要达到x实际还需要x-scur-a[i]这么多天
scur += s[i]; // 更新次数,之后的w-1朵花可以减少淋scur那么多天
move += s[i]; // 累积天数
}
if (move > m)
return false;
}
return true; // move <= m
} int main()
{
while (scanf("%lld%lld%lld", &n, &m, &w) != EOF)
{
a.resize(n+); // 设 a 的 size和capacity 为 n+1(其实n也可以)
for (int i = ; i < n; i++)
scanf("%lld", &a[i]);
ll left = , right = maxn;
ll X = ;
while (left <= right) // < 是错的,一定是 <=
{
ll mid = (left+right) >> ;
if (check(mid)) // 代表每朵花都可以在 m 天内达到mid的高度
{
X = mid;
left = mid + ;
}
else
right = mid - ;
}
printf("%lld\n", X);
}
return ;
}

题解说线段树也能做

http://codeforces.ru/blog/entry/13465?locale=en

总的来说,C题都是比较考思维滴!!!

最新文章

  1. Session阻塞 读写锁引发的小问题
  2. 安装Ubuntu时的硬盘分区方案
  3. bzoj1006 [HNOI2008]神奇的国度
  4. [ActionScript 3.0] AS3虚线绘制方法
  5. Mysql中的count()与sum()区别
  6. IGF职业组比赛
  7. 数据提交成功后如何避免alert被window.location.reload()影响
  8. 使用Vue和thrift建立前后端交互的demo
  9. alpha冲刺第五天
  10. Weblogic10 集群配置
  11. frida的用法--Hook Java代码篇
  12. android开发中调用python代码(带参数)
  13. android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
  14. MFC 修改标题
  15. 【Convex Optimization (by Boyd) 学习笔记】Chapter 2 - Convex sets(1) 仿射集&amp;凸集
  16. Jenkins修改workspace和build目录
  17. JavaScript 学习笔记-HTML&amp;&amp;DOM
  18. 深入详解美团点评CAT跨语言服务监控(三)CAT客户端原理
  19. 从 0 到 1 合理高效使用 GitHub 的资料
  20. 【Git】二、安装配置

热门文章

  1. 实验一 Java实验环境搭建
  2. BT网络中DHT和UPnp的解释(转)
  3. DNS 域名解析过程
  4. d3js 添加数据
  5. WMS8_基本操作
  6. idea安装plugin
  7. Centos 安装Puppet
  8. IOS 汤姆猫核心代码
  9. Python list 和 str 互转
  10. Redis 过期键的设置、获取和删除过期时间