2 条题解

  • 0
    @ 2026-7-4 22:28:54

    #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;
    }
    
    
    • 0
      @ 2026-4-23 10:04:33

      • 1

      信息

      ID
      6319
      时间
      1500ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      2
      已通过
      1
      上传者