不难发现,当我们要选的区间确定后,一定会把仓库安排到中间的稻草上(如果是偶数个的话中间两个都行)。
然后按照坐标从小到大枚举右指针,左指针一定不递减,双指针扫一下就行了.
code:
#include <bits/stdc++.h> #define N 100007 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,num[N]; ll limit,C,x[N],dis[N]; ll calc(int L,int R) { int mid=(L+R)>>1; ll cl=x[mid]*(mid-L+1)-(dis[mid]-dis[L-1]),cr=0; if(R>mid) { cr=dis[R]-dis[mid]-x[mid]*(R-mid); } return cl+cr; } int main() { // setIO("input"); int i,j,l,r,ans=0; scanf("%d%lld%lld",&n,&limit,&C); for(i=1;i<=n;++i) scanf("%lld",&x[i]); sort(x+1,x+1+n); for(i=1;i<=n;++i) { num[i]=i; dis[i]=dis[i-1]+x[i]; } for(l=r=1;r<=n;++r) { while(l<=r&&calc(l,r)>C) ++l; ans=max(ans,r-l+1); } printf("%d ",ans); return 0; }