随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

比如,手机可能位于 5 个区域中,概率分别为 0.3,0.05,0.1,0.3,0.25

则一种方法是先同时访问 \{c1,c2,c3\},再同时访问 {c_4,c_5}

访问区域数量的期望为  3*(0.3 + 0.05 + 0.1) + (3 + 2) *(0.3 + 0.25) = 4.1 

 

而另一种方法是先同时访问 \{c_1,c_4\},再访问 \{c_2,c_3,c_5\}

访问区域数量的期望为 2 * (0.3 + 0.3) + (3 + 2) * (0.05 + 0.1 + 0.25) = 3.2。

你的任务是求出访问区域数量的期望的最小值

 

贪心,从最大的开始,排个序,

然后就是一个简单dp

f[i][j] = min{ f[k][j-1] +    (s[i]-s[k]) *i }

 

复制代码
#include<iostream>
#include<string>
#include <cstring>
#include <algorithm>
using namespace std;
 const int N=105;
 
 #define int long long
 int n,w,sum,a[N],f[N][N];
 int s[N];
  
  int cmp(int x,int y){
      return x>y;
  }
  main(){
     int i,j,k,cas;
     //freopen("in","r",stdin); freopen("out","w",stdout);
     cin>>cas;
     
     while(cas--){
     cin>>n>>w;
     sum=0;
     for(i=1;i<=n;i++) cin>>a[i],sum+=a[i];
     sort(a+1,a+1+n,cmp);
     for(i=1;i<=n;i++) s[i]=s[i-1]+a[i];
     memset(f,127,sizeof f);
     f[0][0]=0;
     
     for(i=1;i<=n;i++)
      for(j=1;j<=w;j++)
       for(k=j-1;k<i;k++)
     f[i][j]=min(f[k][j-1]+i*(s[i]-s[k]),f[i][j]);
     
     printf("%.4f\n",1.0*f[n][w]/sum);
     }
 }
 
 
 
 
 
复制代码

 

posted on   towboat  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示