Description

乡间有一条笔直而长的路称为“米道”。沿着这条米道上 R 块稻田,每块稻田的坐标均
为一个 1 到 L 之间(含 1 和 L)的整数。这些稻田按照坐标以不减的顺序给出,即对于 0 ≤ i <
R,稻田 i 的坐标 X[i]满足 1 ≤ X[0] ≤ ... ≤ X[R-1] ≤ L。 
注意:可能有多块稻田位于同一个坐标上。 
我们计划建造一个米仓用于储存尽可能多的稻米。和稻田一样,米仓将建在米道上,其
坐标也是一个 1 到 L 之间的整数(含 1 和 L)。这个米仓可以建在满足上述条件的任一个位
置上,包括那些原来已有一个或多个稻田存在的位置。 
在收获季节,每一块稻田刚好出产一滿货车的稻米。为了将这些稻米运到米仓,需要雇
用一位货车司机来运米。司机的收费是每一满货车运送一个单位的距离收取 1 元。換言之,
将稻米从特定的稻田运到米仓的费用在数值上等于稻田坐标与米仓坐标之差的绝对值。 
不幸的是,今年预算有限,我们至多只能花费 B 元运费。你的任务是要帮我们找出一个
建造米仓的位置,可以收集到尽可能多的稻米。

Input

第一行 三个整数 R L B
接下来R行 每行一个整数 表示X[i]

Output

一个整数 最多稻米数

Sample Input

5 20 6
1
2
10
12
14

Sample Output

3
HINT
1 ≤ R ≤ 100,000
1 ≤ L ≤ 1,000,000,000
0 ≤ B ≤ 2,000,000,000,000,000
解析:其实去画一画或想一下就会发现,米仓在两个稻田间的任意位置,两个稻田的运费之和都相等,那么我们不如直接考虑将它建在哪一块稻田上。
二分枚举稻田数x,然后用一个for循环来枚举我们所假想收割的x个稻田中最左边的那个稻田位置为l,然后通过x推出r,mi(最右边的位置和中间位置)。谷仓在中间时为最优解(这个自己去试试画出来想)所以谷仓位置为mi。好啦那么我们枚举的这段区间的费用是多少呢?可能很多人会和我一样第一反应是用一个for循环来计算,可是之前的枚举已经是O(nlogn)了,这就决定了我们的计算最好复杂度为O(1)。我们用前缀和来实现。首先设费用为sum,f为一个数组,这个数组中f[i]储存的是1~i块稻田的坐标和,a数组用来储存每块稻田的坐标,设一个变量now来表示米仓的坐标(就是a[now]),则公式为:
  sum=now*(mi-l)-(f[mi-1]-f[l-1])+(f[r]-f[mi])-now*(r-mi); 
为什么这么做呢,下面来解释一下。
我们需要把区间分成左右两边来做,左边的费用等于=now-a[l]+now-a[l+1]+now-a[l+2]+....+now-a[mi-1];我们可以发现他是有多个now-a[?]组合而成,有几项呢?不拿算出总共有mi-l(不是数字1是L!)项,则式子变为=now*(mi-l)-(a[l]+a[l+1]+a[l+2]+....+a[mi-1]);好啦那么a[l]+..+a[mi-1]即为第l块稻田到第mi-1块稻田的坐标之和,完全可以用前缀和直接表示成f[mi-1]-f[l-1],好啦左边的式子最终成为:now*(mi-l)-(f[mi-1]-f[l-1]),同理右边的式子也可以这样推出来(不写啦)。
算出sum后只要比B元小,就成立了,否则不成立。
程序:

#include<iostream>
#include<cstdio>
using namespace std;
long long f[],now,k,ans,a[],sum,n,l,b,lef,righ,mid;
bool check(long long x)
{
int i,l,r,mi;
for (i=;i<=n-x+;++i)
{
l=i;(最左边的稻田) r=i+x-(最右边的稻田); mi=(l+r)/(米仓);
now=a[mi];(米仓坐标)
sum=now*(mi-l)-(f[mi-]-f[l-])+(f[r]-f[mi])-now*(r-mi);
(式子的具体推法已经写在上面了)
if (sum<=b) return true;
}
return false;
}
int main()
{
cin>>n>>l>>b;
for (int i=;i<=n;++i) cin>>a[i];
f[]=;
for (int i=;i<=n;++i) f[i]=f[i-]+a[i];(前i个稻田的坐标之和)
lef=;
righ=n+;
ans=;
while (lef<=righ) (枚举有几块稻田能收割)
{
mid=(lef+righ)/;
if (check(mid)==true)
{
lef=mid+;
if (ans<mid) ans=mid;
}
else righ=mid-;
}
cout<<ans<<endl;
return ;
}

好啦好啦。

 

2600: [Ioi2011]ricehubh的更多相关文章

  1. BZOJ 2600: [Ioi2011]ricehub

    2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 628  Solved: 325[Submit][Stat ...

  2. BZOJ 2600: [Ioi2011]ricehub 双指针+贪心

    不难发现,当我们要选的区间确定后,一定会把仓库安排到中间的稻草上(如果是偶数个的话中间两个都行). 然后按照坐标从小到大枚举右指针,左指针一定不递减,双指针扫一下就行了. code: #include ...

  3. lydsy 2600(二分+中位数前缀和)米仓

    2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 691  Solved: 359[Submit][Stat ...

  4. bzoj 2600 ricehub

    2600: [Ioi2011]ricehub Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 783  Solved: 417[Submit][Stat ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  7. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...

  8. BZOJ_2600_[Ioi2011]ricehub_二分答案

    BZOJ_2600_[Ioi2011]ricehub_二分答案 Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均 为一个 1 到 L 之间(含 ...

  9. BZOJ_2599_[IOI2011]Race_点分治

    BZOJ_2599_[IOI2011]Race_点分治 Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 10 ...

随机推荐

  1. itextSharp 附pdf文件解析

    一.PdfObject: pdf对象 ,有9种,对象是按照对象内涵来分的,如果按照对象的使用规则来说,对象又分为间接对象和直接对象.间接对象是PDF中最常用的对象,如前面对象集合里面的,所有对象都是间 ...

  2. window下乌龟git安装和使用

    一.安装git for windows 首先下载git for windows客户端http://msysgit.github.io/ 安装过程没什么特别的,不停next就ok了 图太多就不继续了~~ ...

  3. WCF大文件传输

    WCF传输文件的时候可以设置每次文件的传输大小,如果是小文件的时候,可以很方便的将文件传递到服务端,但是如果文件比较大的话,就不可取了 遇到大文件的话可以采取分段传输的方式进行文件传输 思路: 1.客 ...

  4. scrollWidth的巧妙运用

    再了无生趣的工作也是能够帮助我们提高的~ 最近工作比较无聊,于是就想到了写一个滚动条插件,在借鉴了mCustomerScrollbar这个组件之后我简单的写了一个类似的,当然,相比于它的2000多行代 ...

  5. nginx 日志分割

    利用 crontab + shell 来实现nginx的 access log 按天切割,便于统计.具体实现如下: shell: #! /bin/sh NGINX_DIR=/data/apps/ngi ...

  6. NHibernate系列文章十一:NHibernate并发控制

    摘要 在同一时刻数据访问量和更新次数比较大的系统中,产生了数据的并发访问问题.并发访问使得在这样的环境中,所有用户(程序.实际用户.进程.线程等)的操作不产生负面问题. 如果不使用并发,在两个用户同时 ...

  7. SPI线协议详解

    更多的内容可以参考 https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus SPI的工作模式: CPOL.CPHA的搭配可以有四种工 ...

  8. i-doit

        官网:http://www.i-doit.org/,有免费版和专业版. 开源:http://sourceforge.net/projects/i-doit/ › Features CMDB I ...

  9. 由于httpClient调用导致的ESTABLISHED过多和 Connection rest by peer 异常

    问题描述: 生产环境突然之间出现了大量的Connection rest by peer.后来使用netstat -an | grep 服务端口号发现有大量来自A10服务器的ESTABLISHED连接, ...

  10. mongoDB 使用手册

      1.基本操作db.AddUser(username,password) 添加用户db.auth(usrename,password) 设置数据库连接验证db.cloneDataBase(fromh ...