3 条题解
-
0
第一问还是比较简单的,假设开会地点左边有3个牛舍,右边有2个牛舍,那么开会地点每往左移一个单位,总路程-3+2=-1,也就是要尽可能让左右两边牛舍数量相同,自然就选在中位数的位置。
如果钱不够,考虑使用双指针,在过程中不断计算总花费,如果过多就左端点右移,注意要及时更新mid。 code:
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,m,a[N],maxx=0; long long ans,s,h=0,c[N];//记得开long long!!! int main(){ //freopen("meeting.in","r",stdin); //freopen("meeting.out","w",stdout); ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m>>s; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); for(int i=1;i<=n;i++){ c[i]=a[i]-a[i-1]; } for(int i=2;i<=n/2+1;i++) ans+=(i-1ll)*c[i]; for(int i=n;i>=n/2+2;i--) ans+=(n-i+1ll)*c[i]; if(ans<=s){ cout<<ans; }else{ int f=1,r,mid; for(r=2;r<=n;r++){ mid=(f+r)>>1; h+=a[r]-a[mid]; while(h>s){ f++; mid=(f+r)>>1; h-=(a[mid]-a[f-1]); if(f==r) h=0; } maxx=max(maxx,r-f+1); } cout<<maxx; } return 0; }
信息
- ID
- 58
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 95
- 已通过
- 13
- 上传者