2 条题解
-
0

#include <cstdio> #include <string> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int M = 8005; #define db double int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } // // int n,m,w,a[M],h[M],s[M],g[M][20],p[M];db f[M][20]; struct node{db x,y;}q[M]; db slope(node a,node b) { return (a.y-b.y)/(a.x-b.x); } Decimal calc(int i,int j) { if(!j) return h[1]; return (calc(g[i][j],j-1)+s[i]-s[g[i][j]])/(i-g[i][j]+1); } signed main() { n=read();m=read();w=read(); h[1]=read();int k=1; for(int i=2;i<=n;i++) { int x=read(); if(x>=h[1]) h[++k]=x; } n=k;m=min(m,n);k=min(m,14);sort(h+1,h+1+n); for(int i=1;i<=n;i++) f[i][0]=h[1],s[i]=s[i-1]+h[i]; for(int j=1;j<=k;j++) { int l=1,r=1;p[1]=1; for(int i=1;i<=n;i++) q[i]=node{i-1,s[i]-f[i][j-1]}; for(int i=2;i<=n;i++) { node u={i,s[i]}; while(l<r && slope(u,q[p[l]]) <slope(u,q[p[l+1]])) l++; g[i][j]=p[l]; f[i][j]=(f[p[l]][j-1]+s[i]-s[p[l]])/(i-p[l]+1); while(l<r && slope(q[p[r-1]],q[p[r]]) >slope(q[p[r]],q[i])) r--; p[++r]=i; } } int o=n-m+k,u=0; for(int i=0;i<=k;i++) if(f[o][i]>f[o][u]) u=i; Decimal ans=calc(o,u); for(int i=o+1;i<=n;i++) ans=(ans+h[i])/2; cout<<ans.to_string(w<<1)<<endl; }
- 1
信息
- ID
- 6319
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者
