提交时间:2024-10-02 17:28:14
运行 ID: 33001
#include<bits/stdc++.h> using namespace std; #define int long long #define double long double #define lson (pos<<1) #define rson (pos<<1|1) int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while('0'<=c&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=2010,MAXM=5010,inf=1000000000; int n,m,q,mx,a[MAXN],p[MAXN],b[MAXN]; int f[2][MAXN][MAXM]; void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(),p[a[i]]++,mx=max(mx,a[i]); for(int i=m;i>=0;i--)p[i]+=p[i+1]; for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)f[m&1^1][i][j]=inf; // for(int i=0;i<=n;i++)f[m&1^1][i][m]=0; f[m&1^1][0][0]=0; sort(a+1,a+n+1); for(int i=m;i>=0;i--){ // for(int o=0;o<=n&&o*i<=m;o++)for(int j=0;j<=m;j++)f[i&1][o][j]=f[i&1^1][o][j]; memcpy(f[i&1],f[i&1^1],sizeof(f[0])); for(int o=1;o<=n&&o*i<=m;o++){ for(int j=i;j<=m;j++){ f[i&1][o][j]=min(f[i&1][o][j],f[i&1][o-1][j-i]+p[i+1]); // cout<<f[i&1][o][j]<<" "; } // cout<<endl; } // cout<<endl; } // for(int i=0;i<=m;i++)res=min(res,f[m&1][n][i]); printf("%.10Lf",(double)f[0][n][m]/n); } signed main(){ slv(); return 0; }