提交时间:2024-10-02 14:27:35
运行 ID: 32912
#include<bits/stdc++.h> #define ll long long #define lson pos<<1 #define rson pos<<1|1 using namespace std; const int maxn=5e3+10; const ll mod=98244353; const ll inf=1e9; ll n,m,k,t,ans,cnt[maxn],tot=0; ll a[maxn],dp[maxn][maxn]; int main(){ // freopen("monster.in","r",stdin); // freopen("monster.out","w",stdout); memset(cnt,0,sizeof(cnt)); scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); cnt[a[i]]++; } for(int i=1;i<=5000;i++) cnt[i]+=cnt[i-1]; int lg=log2(n); for(int i=0;i<=m;i++) dp[1][i]=cnt[i]; //cout<<lg<<endl; int num=1; for(int i=lg-1;i>=0;i--){ for(int j=0;j<=m;j++){ for(int k=0;k<=j;k++){ // cout<<num<<" "<<j<<" "<<k<<" "<<dp[num][j-k]<<" "<<dp[num][k]<<endl; dp[num<<1][j]=max(dp[num<<1][j],dp[num][j-k]+dp[num][k]); } } num<<=1; // cout<<((1<<i)&n)<<endl; if((1<<i)&n){ // cout<<i<<endl; for(int j=0;j<=m;j++){ for(int k=0;k<=j;k++) dp[num+1][j]=max(dp[num+1][j],dp[num][j-k]+dp[1][k]); } num++; } } printf("%.9lf",(double)(n)-(double)(dp[n][m])*(1.0)/n); return 0; }