Cookies
题目描述-点我跳转
你有 m \mathtt{m} m个礼物全部分给 n \mathtt{n} n个小朋友,第 i \mathtt{i} i小朋友的伤害值为 ∑ j = 1 n a i × g i \mathtt{\sum^{n}_{j=1}a_i \times g_i} ∑j=1nai×gi,其中 a i \mathtt{a_i} ai, g i \mathtt{g_i} gi值第 i \mathtt{i} i个小朋友的比他礼物多的人数与一个给定值,求最后每个小朋友伤害值和最小值与其中一种 a i \mathtt{a_i} ai的方案
数据范围
1 ≤ n ≤ 30 , m ≤ 5 × 1 0 3 , g i ≤ 1 0 7 \mathtt{1 \le n \le 30 , m \le 5 \times 10^3 , g_i \le 10^7} 1≤n≤30,m≤5×103,gi≤107
这道题两个人比较只可能是礼物数一样或有人个人羡慕另一个人,那我们就会希望那个羡慕别人的人 g i \mathtt{g_i} gi要小,这样子总伤害才会小;当然我们也希望他们个数可以一样,这时后你会发现因为礼物要发完,所以个数之间会互相干预,这时候要使用dp,当然我们可以先对人的 g i \mathtt{g_i} gi排序,方便我们贪心
解法-贪心DP
d
p
i
,
j
\mathtt{dp_{i,j}}
dpi,j表示前
i
\mathtt{i}
i个人中分
j
\mathtt{j}
j个礼物的最小伤害
转移方程
d
p
i
,
j
=
m
i
n
(
d
p
i
,
j
,
d
p
i
−
k
,
j
−
k
+
(
g
i
−
k
+
1
+
⋯
+
g
i
)
∗
(
i
−
k
)
)
(
k
∈
{
j
∣
j
∈
N
+
,
j
≤
i
}
)
\mathtt{dp_{i,j}=min(dp_{i,j},dp_{i-k,j-k}+(g_{i-k+1}+\dots+g_{i})*(i-k))(k \in \{j|j \in N^+,j\le i\})}
dpi,j=min(dpi,j,dpi−k,j−k+(gi−k+1+⋯+gi)∗(i−k))(k∈{j∣j∈N+,j≤i})
如果当前孩子前面(包括自己)有
k
\mathtt{k}
k个孩子拿到了
1
\mathtt{1}
1个,那他们会被把那些多于一个的人,即
i
−
k
\mathtt{i-k}
i−k人伤害到,此时我们希望这些被伤害到的孩子
g
i
\mathtt{g_i}
gi最小,所以排完序以后是连续的,就可以用前缀和,这里就解释完了
(
g
i
−
k
+
1
+
⋯
+
g
i
)
∗
(
i
−
k
)
\mathtt{(g_{i-k+1}+\dots+g_{i})*(i-k)}
(gi−k+1+⋯+gi)∗(i−k)
这里
g
i
−
k
+
1
+
⋯
+
g
i
\mathtt{g_{i-k+1}+\dots+g_{i}}
gi−k+1+⋯+gi可以使用前缀和