比如,手机可能位于 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); } }
标签:0.1,int,0.25,0.3,访问,1456,uva,include From: https://www.cnblogs.com/towboa/p/16835864.html