• C. Random Events(思维+概率)


    Problem - 1461C - Codeforces

    罗恩是一个长度为n的排列组合的快乐主人。

    一个长度为n的排列组合是一个由1到n的n个不同的整数按任意顺序组成的阵列。例如,[2,3,1,5,4]是一个排列组合,但是[1,2,2]不是一个排列组合(2在数组中出现了两次),[1,3,4]也不是一个排列组合(n=3,但是数组中有4)。


    罗恩的排列组合要经过m个以下类型的实验:(ri,pi)。这意味着范围[1,ri]中的元素(换句话说,长度为ri的前缀)必须以pi的概率进行升序排序。所有的实验都是按照输入数据中指定的顺序进行的。

    作为一个例子,我们来看看一个排列组合[4,2,1,5,3]和一个实验(3,0.6)。在这样一个概率为60%的实验之后,排列组合将变成[1,2,4,5,3]的形式,而概率为40%的排列组合将保持不变。

    你必须确定经过m次实验后,排列组合成为完全升序排序的概率。

    输入
    每个测试包含一个或多个测试案例。第一行包含测试用例的数量t(1≤t≤100)。

    每个测试案例的第一行包含两个整数n和m(1≤n,m≤105)--分别是排列组合的长度和实验的数量。

    每个测试用例的第二行包含n个整数a1,a2,...,an(1≤ai≤n)--排列组合的内容。

    每个测试案例的下面m行分别包含一个整数ri和一个实数pi(1≤ri≤n,0≤pi≤1)--前缀的长度和它被排序的概率。所有的概率都最多给出6位小数。

    保证n和m的总和不超过105(∑n,∑m≤105)。

    输出
    对于每个测试案例,打印一个数字--经过所有实验后,排列组合成为升序排列的概率。如果你的答案的绝对或相对误差不超过10-6,将被认为是正确的。

    形式上,让你的答案为a,陪审团的答案为b。你的答案被接受,当且仅当|a-b|max(1,|b|)≤10-6。

    例子
    输入复制
    4
    4 3
    4 3 2 1
    1 0.3
    3 1
    4 0.6
    5 3
    4 2 1 3 5
    3 0.8
    4 0.6
    5 0.3
    6 5
    1 3 2 4 5 6
    4 0.9
    5 0.3
    2 0.4
    6 0.7
    3 0.5
    4 2
    1 2 3 4
    2 0.5
    4 0.1
    输出拷贝
    0.600000
    0.720000
    0.989500
    1.000000
    备注
    对第一个测试案例的解释。可以证明,最终的排列组合是否被排序完全取决于在(4,0.6)实验中进行的排序。

    题解:
    非常简单的一道题,主要看能不能理解题意

    从后往前找第一个a[i] 不等于i的,因为如果a[i] = i,代表i往后的都已排好序,不需要操作,如果a[i]!=i,ma=  i代表要对前i个进行排序,

    剩下就是找前缀大于ma的找不可能的情况(1-y)相乘,最后

    1- ans就是可能的概率

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. #define int long long
    10. int a[200505];
    11. int b[200050];
    12. void solve()
    13. {
    14. int n,m;
    15. cin >> n >> m;
    16. for(int i = 1;i <= n;i++)
    17. cin >> a[i];
    18. int ma = 0;
    19. for(int i = 1;i <= n;i++)
    20. {
    21. if(a[i]!=i)
    22. {
    23. ma = i;
    24. }
    25. }
    26. double ans = 1;
    27. for(int i = 1;i <= m;i++)
    28. {
    29. int x;
    30. double y;
    31. cin >> x>>y;
    32. if(x >= ma)
    33. {
    34. ans = ans*(1.0 - y);
    35. }
    36. }
    37. ans = 1.0 - ans;
    38. if(ma != 0)
    39. printf("%.8lf\n",ans);
    40. else
    41. printf("%lf\n",1.0);
    42. }
    43. signed main()
    44. {
    45. int t = 1;
    46. cin >> t;
    47. while(t--)
    48. {
    49. solve();
    50. }
    51. }

     

  • 相关阅读:
    计算机毕业设计(附源码)python学生量化考核系统
    Jackson ImmunoResearch通过 SDS-PAGE 进行蛋白质分离
    机器学习介绍(上)
    Java中方法的使用
    万宾科技管网水位监测预警,管网水位的特点有哪些?
    微信小程序——简易复制文本
    PolarDB 助力易仓打造跨境行业生态链协同的产业链 SaaS
    PWN利器-pwntools安装、调试教程一览
    Reggie外卖项目 —— 分类管理模块之删除分类功能
    终于有人将TWI(串行通讯接口)给讲通了!
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127985545