Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32902 | A21μΘ_wjy | 【S】T1 | C++ | 通过 | 100 | 176 MS | 388 KB | 1233 | 2024-10-02 14:14:57 |
#include<bits/stdc++.h> #define int long long #define doub long double using namespace std; const int INF=1e9+7; const int maxn=1e3+7; const int maxm=5e3+7; int n,m; int a[maxn]; int val[maxm]; int dp[maxm]; int tmp[maxm]; int cnt(int x){ int l=1,r=n; if(x<a[1])return n; if(x>=a[n])return 0; while(l<r){ int mid=l+r>>1; if(a[mid]>x)r=mid; else l=mid+1; } return n-l+1; } inline void mul(){ for(int j=0;j<=m;j++)tmp[j]=INF; for(int j=m;j>=0;j--){ for(int c=0;c<=j;c++)tmp[j]=min(tmp[j],dp[j-c]+dp[c]); } for(int j=0;j<=m;j++)dp[j]=tmp[j]; } inline void add(){ for(int j=0;j<=m;j++)tmp[j]=INF; for(int j=m;j>=0;j--){ for(int c=0;c<=j;c++)tmp[j]=min(tmp[j],dp[j-c]+val[c]); } for(int j=0;j<=m;j++)dp[j]=tmp[j]; } int L[maxn]; signed main(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1); for(int c=0;c<=m;c++)val[c]=cnt(c); for(int i=1;i<=m;i++)dp[i]=INF; dp[0]=0; int cnt=-1; int h=n; while(h){ L[++cnt]=h&1; h>>=1; } for(int i=cnt;i>=0;i--){ mul(); if(L[i])add(); } cout<<fixed<<setprecision(12)<<1.0*dp[m]/n<<endl; }