JZOJ 4772. 运输妹子

来源:互联网 发布:cms建站是什么意思 编辑:程序博客网 时间:2024/04/28 18:30

Problem

Description

小轩轩是一位非同一般的的大农(lao)场(si)主(ji),他有一大片非同一般的农田,并且坐落在一条公路旁(可以认为是数轴),在他的农田里种的东西也非同一般——不是什么水稻小麦,而是妹子。
在小轩轩的细心培育下,他的大片农田都要结出妹子啦!但是他的农田分布实在是太广阔了,他担心自己的妹子会令路过的人想入非非,于是他想要把所有农田上的妹子都集中到一个仓库里面,贮存起来。可是妹子太多,他叫来了一辆卡车,这辆卡车刚好可以装满一个农田的妹子,并且在满载的情况下,运满满一卡车妹子走1米的费用是1元。由于小轩轩技术精湛,他的每个农田产量都是一样的。即把一个农田的妹子都运到仓库费用为农田与仓库坐标差值的绝对值。理想很美好,但现实很残酷——小轩轩还没有想好在什么位置搭建他的仓库,而且他的运输费用是有限的。
请你帮忙计算一下,在什么位置搭建仓库,使得小轩轩能收获的妹子最多。(仓库的位置可与农田的位置重合,并且在公路长度范围内)。

Input

第一行三个正整数 N,L,W,分别表示农田个数、公路总长度、总钱数。
接下来 N 行,每一行描述一个农田的坐标。(可能有多个农田位于同一位置)

Output

一个整数,小轩轩最多能够收藏多少个农田的妹子。

Sample Input

5 23 18
4
6
14
18
22

Sample Output

3

Data Constraint

对于 30% 的数据,N≤1000,L≤10000。
对于 60% 的数据,N≤10000,L≤1000000。
对于 100% 的数据,N≤100000,L≤1000000000,W≤2000000000000000

Solution

我们二分答案ans,看看最优情况下能够用多少钱。
显而易见,如果我们花最少的钱,那么最优情况就是选连续ans个农田,并且仓库在中位数上。我们枚举起点,设起点为l,终点为r,中位数为mid,花费就是

(Σri=mid+1a[i]a[mid](rmid))(Σmidi=la[i]a[mid](midl+1))

Code

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#define N 100010#define LL long long#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;LL n,l,r,mid,L,w,a[N],sum[N],ans;int i,j,k,t;bool ok(int x){    int i;    LL temp,ll,rr,mmid;    fo(i,1,n-x+1)    {        ll=i;rr=i+x-1;        mmid=(ll+rr)/2;        temp=((sum[rr]-sum[mmid])-a[mmid]*(rr-mmid))-((sum[mmid]-sum[ll-1])-a[mmid]*(mmid-ll+1));        if (temp<=w) return 1;    }    return 0;}int main(){    scanf("%lld%lld%lld",&n,&L,&w);    fo(i,1,n) scanf("%lld",&a[i]);    sort(a+1,a+n+1);    fo(i,1,n) sum[i]=sum[i-1]+a[i];    l=1;r=n;    while (l<=r)    {        mid=(l+r)/2;        if (ok(mid)) ans=mid,l=mid+1;else r=mid-1;    }    printf("%lld",ans);}
3 0
原创粉丝点击