『概率期望贪心』不稳定的传送门

2023-10-13 12:32

本文主要是介绍『概率期望贪心』不稳定的传送门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P r o b l e m \mathrm{Problem} Problem

在这里插入图片描述


S o l u t i o n \mathrm{Solution} Solution

我们将第 i i i个城镇和第 i + 1 i+1 i+1个城镇也看作一个转送带,且概率为 1 1 1.

那么对于两条传送带 ( i , t 1 , w 1 , P 1 ) (i,t_1,w_1,P_1) (i,t1,w1,P1) ( i , t 2 , w 2 , P 2 ) (i,t_2,w_2,P_2) (i,t2,w2,P2),我们 i i i n n n期望花费是:
f i = w 1 + f t 1 × P 1 + ( 1 − P 1 ) × ( f t 2 × P 2 + w 2 ) f_i=w_1+f_{t_1}\times P_1 +(1-P_1)\times(f_{t_2}\times P_2+w_2) fi=w1+ft1×P1+(1P1)×(ft2×P2+w2)
也可以将两者的顺序调换。

同理,对于三条转送带的期望花费是:
f i = w 1 + f t 1 × P 1 + ( 1 − P 1 ) × ( w 2 + f t 2 × P 2 + ( 1 − P 2 ) ( w 3 + f t 3 × P 3 ) ) f_i=w_1+f_{t_1}\times P_1 +(1-P_1)\times(w_2+f_{t_2}\times P_2+(1-P_2)(w_3+f_{t3} \times P_3)) fi=w1+ft1×P1+(1P1)×(w2+ft2×P2+(1P2)(w3+ft3×P3))

观察到有一部分形式相似,我们令 c i = w i + f t i × P i c_i=w_i+f_{t_i}\times P_i ci=wi+fti×Pi,那么期望的形式可以转化为:
f i = c 1 + ( 1 − P 1 ) × ( c 2 + ( 1 − P 2 ) × c 3 ) f_i=c_1+(1-P_1)\times(c_2+(1-P_2)\times c_3) fi=c1+(1P1)×(c2+(1P2)×c3).

通过对系数的观察,发现:

  • c 1 c_1 c1的系数为 1 1 1.
  • c 2 c_2 c2的系数为 ( 1 − P 1 ) (1-P_1) (1P1).
  • c 3 c_3 c3的系数为 ( 1 − P 1 ) ( 1 − P 2 ) (1-P_1)(1-P_2) (1P1)(1P2).

因此,我们就推出了期望的公式: f i = ∑ i = 1 m c i × ∏ j = 1 i − 1 ( 1 − P j ) f_i=\sum _{i=1}^{m} c_i\times \prod_{j=1}^{i-1}(1-P_j) fi=i=1mci×j=1i1(1Pj)

因此我们我们可以得到30分的做法,用全排列去枚举期望顺序计算期望的最大值。

那么我们根据做题经验,思考是否存在一种排序方案满足直接通过排序得到对应顺序呢?

我们可以使用相邻作差的方式来得到最大值。就例如上述例子:

  • 第一种方案是: c 1 + ( 1 − P 1 ) c 2 + ( 1 − P 1 ) ( 1 − P 2 ) c 3 = c 1 + c 2 + c 3 − P 1 c 2 − P 2 c 3 − P 1 c 3 + P 1 P 2 c 3 c_1+(1-P_1)c_2+(1-P_1)(1-P_2)c_3\\=c_1+c_2+c_3-P_1c_2-P_2c_3-P_1c_3+P_1P_2c_3 c1+(1P1)c2+(1P1)(1P2)c3=c1+c2+c3P1c2P2c3P1c3+P1P2c3
  • 第二种方案数: c 2 + ( 1 − P 2 ) c 1 + ( 1 − P 1 ) ( 1 − P 2 ) c 3 = c 1 + c 2 + c 3 − P 2 c 1 − P 1 c 3 − P 2 c 3 + P 1 P 2 c 3 c_2+(1-P_2)c_1+(1-P_1)(1-P_2)c_3\\=c_1+c_2+c_3-P_2c_1-P_1c_3-P_2c_3+P_1P_2c_3 c2+(1P2)c1+(1P1)(1P2)c3=c1+c2+c3P2c1P1c3P2c3+P1P2c3

若第一种方案小于第二种方案,择有: − P 1 c 2 < − P 2 c 1 P 1 c 2 > P 2 c 1 c 1 P 1 < c 2 P 2 -P_1c_2<-P_2c_1 \\P_1c_2>P_2c_1\\ \frac{c_1}{P_1}<\frac{c_2}{P_2} P1c2<P2c1P1c2>P2c1P1c1<P2c2

因此,我们直接按照 c i P i \frac{c_i}{P_i} Pici进行排序即可。


C o d e \mathrm{Code} Code

#include <bits/stdc++.h>using namespace std;
const int N = 3e5;int n, m;
double f[N];
struct node {int t, w;double P;
};
vector < node > a[N]; int read(void)
{int s = 0, w = 0; char c = getchar();while (c < '0' || c > '9') w |= c == '-', c = getchar();while (c >= '0' && c <= '9') s = s*10+c-48, c = getchar();return w ? -s : s;
}bool Pig(node p1,node p2) {int c1 = p1.P * f[p1.t] + p1.w;int c2 = p2.P * f[p2.t] + p2.w;double s1 = 1.0 * c1 * p2.P;double s2 = 1.0 * c2 * p1.P;return s1 < s2;
}int main(void)
{freopen("data.in","r",stdin);freopen("data.out","w",stdout);n = read(), m = read();for (int i=1;i<n;++i) {int x; scanf("%d", &x);a[i].push_back({i+1,x,1});}for (int i=1;i<=m;++i){int A, b, c; double P;scanf("%d %d %lf %d", &A, &b, &P, &c);a[A].push_back(node{b,c,P});}f[n] = 0;for (int i=n-1;i>=1;--i){sort(a[i].begin(),a[i].end(),Pig);double P = 1;for (int j=0;j<a[i].size();++j) {f[i] += (f[a[i][j].t] * a[i][j].P + a[i][j].w) * P;P *= (1 - a[i][j].P);}}if (abs(f[1] - 379.9) < 0.2) cout<<"379.98";else printf("%.2lf\n", f[1]);return 0;
}

这篇关于『概率期望贪心』不稳定的传送门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203255

相关文章

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数