题解:AT_abc203_f [ABC203F] Weed
untergehen · · 题解
首先看到
接下来考虑 dp。我们考察每次拔除草的过程,就是每次将大于原最大值的部分除去。这个过程最多只会进行
后面的步骤就顺理成章了,定义
这个转移是
复杂度
代码:
#include<bits/stdc++.h>
#define int long long
#define maxn 200005
using namespace std;
int n,k;
int a[maxn],dp[maxn][50];
signed main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
memset(dp,0x3f,sizeof dp);
sort(a+1,a+n+1);
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=40;j++){
dp[i][j]=dp[i-1][j]+1;
int last=upper_bound(a+1,a+i+1,a[i]/2)-a-1;
if(j>0)dp[i][j]=min(dp[i][j],dp[last][j-1]);
}
}
for(int i=0;i<=40;i++){
if(dp[n][i]<=k){
cout<<i<<' '<<dp[n][i];
break;
}
}
return 0;
}