• [BZOJ2600] ricehub


    问题描述

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

    输入格式

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

    输出格式

    一个整数 最多稻米数

    样例输入

    5 20 6
    1
    2
    10
    12
    14

    样例输出

    3

    数据范围

    1 ≤ R ≤ 100,000
    1 ≤ L ≤ 1,000,000,000
    0 ≤ B ≤ 2,000,000,000,000,000

    解析

    设选的点坐标为a,则问题是求在满足(sum_{i=l}^{r}|x_i-a|<=B)(r-l+1)的最大值。计算绝对值之和可以用中位数解决。我们可以从左往右枚举每个点作为r时满足条件的最大的区间,即当([l,r])不满足条件时将(l)往前移动直至满足条件。用一个指针即可。注意每移动一次都要更新中位数。

    代码

    #include <iostream>
    #include <cstdio>
    #define N 200002
    #define int long long
    using namespace std;
    int l,r,b,i,L=1,R,x[N],sumr[N],suml[N];
    signed main()
    {
    	cin>>r>>l>>b;
    	for(i=1;i<=r;i++) cin>>x[i];
    	for(i=2;i<=r;i++) suml[i]=suml[i-1]+x[i]-x[i-1];
    	for(i=r-1;i>=1;i--) sumr[i]=sumr[i+1]+x[i+1]-x[i];
    	for(i=2;i<=r;i++) suml[i]+=suml[i-1];
    	for(i=r-1;i>=1;i--) sumr[i]+=sumr[i+1];
    	int ans=0;
    	for(R=1;R<=r;R++){
    		int mid=L+(R-L+1)/2;
    		while(suml[R]-suml[mid]-(R-mid)*(x[mid]-x[1])+sumr[L]-sumr[mid]-(mid-L)*(x[r]-x[mid])>b){
    			L++;
    			mid=L+(R-L+1)/2;
    		}
    		ans=max(ans,R-L+1);
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    linux-指令
    rabbitmq启动
    [浪峰前端开发]JS获取当前时间戳的方法
    [浪峰JQuery开发]jquery最有意思的IFrame类似应用--值得深入研究
    [浪峰分享]移动电商:不是渠道拓展,而是一次重新创业
    [浪峰分享]App必死 Web永生 看Web的前世今生 必会卷土重来
    [浪峰分享]推荐一些不错的计算机书籍
    [浪峰转载]Jquery取得iframe中元素的几种方法
    [浪峰分享] 如何管理一个远程团队
    [浪峰分享] 博客园博客导航固顶--简单实用的css代码
  • 原文地址:https://www.cnblogs.com/LSlzf/p/11437321.html
Copyright © 2020-2023  润新知