题目链接: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题都是比较考思维滴!!!

codeforces 460C. Present 解题报告的更多相关文章

  1. codeforces B. New Year Present 解题报告

    题目链接:http://codeforces.com/contest/379/problem/B 题目意思:给定一个有n个钱包的序列,其中第i个钱包需要投入ai个钱币,需要编写一个程序,使得在对第i个 ...

  2. Codeforces Round #300 解题报告

    呜呜周日的时候手感一直很好 代码一般都是一遍过编译一遍过样例 做CF的时候前三题也都是一遍过Pretest没想着去检查... 期间姐姐提醒说有Announcement也自信不去看 呜呜然后就FST了 ...

  3. codeforces 31C Schedule 解题报告

    题目链接:http://codeforces.com/problemset/problem/31/C 题目意思:给出 n 个 lessons 你,每个lesson 有对应的 起始和结束时间.问通过删除 ...

  4. codeforces 499B.Lecture 解题报告

    题目链接:http://codeforces.com/problemset/problem/499/B 题目意思:给出两种语言下 m 个单词表(word1, word2)的一一对应,以及 profes ...

  5. codeforces 495C. Treasure 解题报告

    题目链接:http://codeforces.com/problemset/problem/495/C 题目意思:给出一串只有三种字符( ')','(' 和 '#')组成的字符串,每个位置的这个字符 ...

  6. codeforces 490B.Queue 解题报告

    题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位 ...

  7. CodeForces 166E -Tetrahedron解题报告

    这是本人写的第一次博客,学了半年的基础C语言,初学算法,若有错误还请指正. 题目链接:http://codeforces.com/contest/166/problem/E E. Tetrahedro ...

  8. codeforces 489A.SwapSort 解题报告

    题目链接:http://codeforces.com/problemset/problem/489/A 题目意思:给出一个 n 个无序的序列,问能通过两两交换,需要多少次使得整个序列最终呈现非递减形式 ...

  9. codeforces 485A.Factory 解题报告

    题目链接:http://codeforces.com/problemset/problem/485/A 题目意思:给出 a 和 m,a 表示第一日的details,要求该日结束时要多生产 a mod ...

随机推荐

  1. java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page pagehelper报错无法类型转化。

    报错信息: 严重: Servlet.service() for servlet [springmvc] in context with path [] threw exception [Request ...

  2. Typora +google + Markdown Here 公众号

    一劳永逸的公众号排版方法  http://mp.weixin.qq.com/s/zb-YaacNLggG2-njF5HJ0A 

  3. 【java】spring项目中 对entity进行本类间的克隆

    方法1: [使用spring自带BeanUtils实现克隆] [要求:需要被克隆的类实现Cloneable接口并且重写clone()方法] >例子: >>实体: package co ...

  4. Delphi图像处理 -- 颜色矩阵变换

    转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般 ...

  5. [Servlet&amp;JSP] 从JSP到Servlet

    JSP与Servlet是一体的两面,JSP最后都会被容器转译为Servlet源码,自己主动编译为.class文件,载入.class文件然后生成Servlet对象. 由容器转译后的Servlet类具有_ ...

  6. RecyclerView onItemClick button和布局都有单击事件时的处理方式

    RecyclerView为了给开发人员提供更大的自由度.没有默认的提供onItemClick接口. 网上有一种比較简单的实现方式 , 适用于不须要针对item里面某个button做特殊处理的情况 我眼 ...

  7. 从零開始开发Android版2048 (二)获取手势信息

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  8. 别样JAVA学习(五)继承上(1.1)Object类toString()

    接下来说完equals以后,我们学习接下来的toString(), Java又觉得全部对象不光具有比較性, 还能使对象变成字符串被打印. 出现 曾经前面显示的是数组.如今显示的是这个对象所属的类. 紧 ...

  9. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  10. Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

    一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网 ...