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;
}

浙公网安备 33010602011771号