题解:CF985E Pencils and Boxes
__CrossBow_EXE__ · · 题解
题意
有
题解
一眼动态规划。
注意到放的顺序对结果没有影响,考虑先对权值排序。而排序后,我们再把所有铅笔分成若干个区间,每个区间对应放入一个盒子。这样一定是最优的。
定义
接着,既然我们想要枚举
往回退一步,其实我们只需要判断在
代码
#include<bits/stdc++.h>
using namespace std;
#define up(_name_,_leftbound_,_rightbound_) for(auto _name_=(_leftbound_);(_name_)<=(_rightbound_);++(_name_))
int n,k,d;
const int N=500005;
int a[N];
int dp[N],sum[N];
int l=0;
bool check(int l,int r){
if(l>r) return 0;
else if(!l) return 1;
else return sum[r]>sum[l-1];
}
signed main(int argc,char *argv[]){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k>>d;
up(i,1,n) cin>>a[i];
sort(a+1,a+n+1);
dp[0]=sum[0]=1;
up(i,1,n){
while(1){
if(a[i]-a[l+1]<=d) break;
l++;
}
dp[i]=check(l,i-k);
sum[i]=sum[i-1]+dp[i];
}
if(dp[n]) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
/*
---INFORMATIONS---
TIME:2025/7/6 10:27:27
PROBLEM:CF985E
CODE BY __CrossBow_EXE__ Luogu uid967841
*/