3 条题解

  • 0
    @ 2025-10-7 14:24:06

    第一问还是比较简单的,假设开会地点左边有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
    上传者