题面:https://ac.nowcoder.com/acm/contest/33189/A
由题意:
可设选择的服务器下标为a[1],a[2]…a[m]
则总计算效率为
∑
i
=
1
m
w
a
i
∏
j
=
0
i
−
1
p
a
j
\sum_{i=1}^m{w_{a_i}}\prod_{j=0}^{i-1}{p_{a_j}}
i=1∑mwaij=0∏i−1paj
观察式子可发现,以下部分的值随选择的服务器的不同而不同,当然,也与选择服务器排放的顺序有关
∏
j
=
0
i
−
1
p
a
j
\prod_{j=0}^{i-1}{p_{a_j}}
j=0∏i−1paj
先考虑顺序:
可设已选的服务器a[x],a[y]满足y=x+1
当以原序时:
R
1
=
∑
i
=
1
x
−
1
w
a
i
∏
j
=
0
i
−
1
p
a
j
+
w
a
x
∏
j
=
0
x
−
1
p
a
j
+
w
a
y
p
a
x
∏
j
=
0
x
−
1
p
a
j
+
∑
i
=
y
+
1
m
w
a
i
∏
j
=
0
i
−
1
p
a
j
R_1=\sum_{i=1}^{x-1}{w_{a_i}}\prod_{j=0}^{i-1}{p_{a_j}}+w_{a_x}\prod_{j=0}^{x-1}{p_{a_j}}+w_{a_y}p_{a_x}\prod_{j=0}^{x-1}{p_{a_j}}+\sum_{i=y+1}^m{w_{a_i}}\prod_{j=0}^{i-1}{p_{a_j}}
R1=i=1∑x−1waij=0∏i−1paj+waxj=0∏x−1paj+waypaxj=0∏x−1paj+i=y+1∑mwaij=0∏i−1paj
当x与y交换位置时:
R
2
=
∑
i
=
1
x
−
1
w
a
i
∏
j
=
0
i
−
1
p
a
j
+
w
a
y
∏
j
=
0
x
−
1
p
a
j
+
w
a
x
p
a
y
∏
j
=
0
x
−
1
p
a
j
+
∑
i
=
y
+
1
m
w
a
i
∏
j
=
0
i
−
1
p
a
j
R_2=\sum_{i=1}^{x-1}{w_{a_i}}\prod_{j=0}^{i-1}{p_{a_j}}+w_{a_y}\prod_{j=0}^{x-1}{p_{a_j}}+w_{a_x}p_{a_y}\prod_{j=0}^{x-1}{p_{a_j}}+\sum_{i=y+1}^m{w_{a_i}}\prod_{j=0}^{i-1}{p_{a_j}}
R2=i=1∑x−1waij=0∏i−1paj+wayj=0∏x−1paj+waxpayj=0∏x−1paj+i=y+1∑mwaij=0∏i−1paj
用
R
1
−
R
2
R_1-R_2
R1−R2可得:
R
1
−
R
2
=
∏
j
=
0
x
−
1
p
a
j
(
w
a
x
+
w
a
y
p
a
x
−
w
a
y
+
w
a
x
p
a
y
)
R_1-R_2=\prod^{x-1}_{j=0}p_{a_j}(w_{a_x}+w_{a_y}p_{a_x}-w_{a_y}+w_{a_x}p_{a_y})
R1−R2=j=0∏x−1paj(wax+waypax−way+waxpay)
若
a
x
a_x
ax在
a
y
a_y
ay前更优
则
R
1
−
R
2
≥
0
R_1-R_2\geq 0
R1−R2≥0
即
w
a
x
+
w
a
y
p
a
x
−
w
a
y
−
w
a
x
p
a
y
≥
w_{a_x}+w_{a_y}p_{a_x}-w_{a_y}-w_{a_x}p_{a_y}\geq
wax+waypax−way−waxpay≥
整理可得:
w
a
x
(
1
−
p
a
y
)
−
w
a
y
(
1
−
p
a
x
)
≥
0
w_{a_x}(1-p_{a_y})-w_{a_y}(1-p_{a_x})\geq0
wax(1−pay)−way(1−pax)≥0
所以
1
−
p
a
y
w
a
y
≥
1
−
p
a
x
w
a
x
\frac{1-p_{a_y}}{w_{a_y}}\geq\frac{1-p_{a_x}}{w_{a_x}}
way1−pay≥wax1−pax
故是偏序,可以通过排序来找到最优的次序
考虑服务器:
因为后面会被前面影响,可考虑
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]为i到n中选j个的最优值,从后往前枚举
则
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
+
1
]
[
j
]
,
d
p
[
i
+
1
]
[
j
−
1
]
∗
p
i
+
w
i
dp[i][j]=max(dp[i+1][j],dp[i+1][j-1]*p_i+w_i
dp[i][j]=max(dp[i+1][j],dp[i+1][j−1]∗pi+wi
代码:
#include<bits/stdc++.h>
using namespace std;
const int MXN=1e5+7;
struct Node{
double p,w;
}a[MXN];
double dp[MXN][30];
bool cmp(Node x,Node y){
return (1-y.p)/y.w>=(1-x.p)/x.w;
}
int main(){
int n,m,q;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].w;
}
for(int i=1;i<=n;i++){
cin>>q;
a[i].p=1.0*q/(1.0*10000);
}
sort(a+1,a+n+1,cmp);
for(int i=n;i>=1;i--){
for(int j=1;j<=min(m,n-i+1);j++){
dp[i][j]=max(dp[i+1][j],dp[i+1][j-1]*a[i].p+a[i].w);
}
}
printf("%.16lf\n",dp[1][m]);
}