Codeforces Round #689 (Div. 2, based on Zed Code Competition) - C. Random Events

题目链接

Codeforces Round #689 (Div. 2, based on Zed Code Competition) - C. Random Events


Description

  • Ron is a happy owner of a permutation a of length n.
    A permutation of length n is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation (2 appears twice in the array) and [1,3,4] is also not a permutation (n=3 but there is 4 in the array).
  • Ron’s permutation is subjected to m experiments of the following type: (ri, pi). This means that elements in range [1,ri] (in other words, the prefix of length ri) have to be sorted in ascending order with the probability of pi. All experiments are performed in the same order in which they are specified in the input data.
  • As an example, let’s take a look at a permutation [4,2,1,5,3] and an experiment (3,0.6). After such an experiment with the probability of 60% the permutation will assume the form [1,2,4,5,3] and with a 40% probability it will remain unchanged.
    You have to determine the probability of the permutation becoming completely sorted in ascending order after m experiments.

Input

  • Each test contains one or more test cases. The first line contains the number of test cases t (1≤t≤100).
    The first line of each test case contains two integers n and m (1≤n,m≤105) — the length of the permutation and the number of experiments, respectively.
    The second line of each test case contains n integers a1,a2,…,an (1≤ai≤n) — contents of the permutation.
    The following m lines of each test case each contain an integer ri and a real number pi (1≤ri≤n,0≤pi≤1) — the length of the prefix and the probability of it being sorted. All probabilities are given with at most 6 decimal places.
    It is guaranteed that the sum of n and the sum of m does not exceed 10^5 (∑n,∑m≤10^5).

Output

  • For each test case, print a single number — the probability that after all experiments the permutation becomes sorted in ascending order. Your answer will be considered correct if its absolute or relative error does not exceed 10^−6.
    Formally, let your answer be a, and the jury’s answer be b. Your answer is accepted if and only if |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

思路

  • 找到必须要重新排列的前t个数,然后只需用结构体接收ri大于等于t的概率,并按照ri从小到大排序,求出包含前t个数重新排列的概率即可(简单的数学概率问题),假如全部是升序排列则概率为1.

AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int aa[maxn];
struct node{
    int a;
    double b;
};
node g[maxn];
int cmp(node x,node y){
    return x.a<y.a;
}
int main(){
    int tt;
    cin>>tt;
    while(tt--){
        memset(g,0,sizeof(g));
        int n,m;
        int t;
        int pos=0;
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>aa[i];
        int flag=0;//判断是否全部是升序排列
        for(t=n-1;t>=0;t--){//从后往前判断前几个数需要排列
            if(aa[t]!=t+1){
                flag=1;
                break;
            }
        }
        t++;
        for(int i=0;i<m;i++){
            int a;double b;
            cin>>a;
            cin>>b;
            if(a>=t){//只需接收a大于等于t的概率
                g[pos].a=a;
                g[pos].b=b;
                pos++;
            }
        }
        if(flag==0){   
            double gai=1;
            printf("%lf\n",gai);
            continue;
        }
        sort(g,g+pos,cmp);//将g按照g.a从小到大排序
        double gai=0;
        for(int i=0;i<pos;i++){
            gai+=(1.0-gai)*g[i].b;//求数学概率问题
        }
        printf("%lf\n",gai);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独一无二的VV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值