1255: 最大容量和

二分查找,如果后面的l,r用mid来代替,一定要记得跳出循环时在更新一下mid
第一次做的时候明明是会的,第二次反而不会做了

#include <bits/stdc++.h>
using namespace std;
int n,k,l;
vector<long long> vec;
int main(){
	scanf("%d%d%d",&n,&k,&l);
	int i=n*k;
	while(i--){
		int temp;
		scanf("%d",&temp);
		vec.push_back(temp);
	}
	sort(vec.begin(),vec.end());
	if(vec[0]+l<vec[n-1]){
		printf("0");
		return 0;
	}
	int l1=0,r=n*k-1;
	int mid =0;
	while(l1<r){
		mid = l1+(r-l1+1)/2;
		if(vec[mid]<= vec[0]+l) l1=mid;
		else r=mid-1;
	}
	mid = l1+(r-l1+1)/2;

	int num = n*k-mid-1;
	long long  sum=0;
	while(mid>=0){
		if(num>=k-1){
			sum+=vec[mid];
			num-=k-1;
		}
		else{
			num++;
		}
		mid--;
	}
	printf("%lld",sum);
	return 0;
} 
posted @ 2026-03-08 11:16  peter_shen  阅读(10)  评论(0)    收藏  举报