• bzoj4318: OSU!&&CF235BLet's Play Osu!


    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4318

    4318: OSU!

    Time Limit: 2 Sec  Memory Limit: 128 MB
    Submit: 374  Solved: 294
    [Submit][Status][Discuss]

    Description

    osu 是一款群众喜闻乐见的休闲软件。 
    我们可以把osu的规则简化与改编成以下的样子: 
    一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释) 
    现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。 
     
     

    Input

    第一行有一个正整数n,表示操作个数。接下去n行每行有一个[0,1]之间的实数,表示每个操作的成功率。 
     
     

    Output

    只有一个实数,表示答案。答案四舍五入后保留1位小数。 
     

    Sample Input

    3
    0.5
    0.5
    0.5

    Sample Output

    6.0

    HINT

    【样例说明】 

    000分数为0,001分数为1,010分数为1,100分数为1,101分数为2,110分数为8,011分数为8,111分数为27,总和为48,期望为48/8=6.0 

    N<=100000

    Source

    考虑每一位对答案的贡献为f[i];则f[i]=p[i]*(3*e1[i-1]+3*e2[i-1]+1),e1[i]表示到i位连续1的期望,e2[i]就是平方的期望。把每一位的贡献加起来就是答案。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define maxn 100005
     7 using namespace std;
     8 int n;
     9 typedef double ld;
    10 ld ans,p[maxn],f[maxn],e1[maxn],e2[maxn];
    11 int main(){
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++)scanf("%lf",&p[i]);
    14     for(int i=1;i<=n;i++){
    15         f[i]=p[i]*(1+3*e1[i-1]+3*e2[i-1]);
    16         e1[i]=p[i]*(e1[i-1]+1);e2[i]=p[i]*(e2[i-1]+2*e1[i-1]+1);
    17     }
    18     for(int i=1;i<=n;i++)ans+=f[i];
    19     printf("%.1lf
    ",ans);
    20     return 0;
    21 }
    View Code

    题目链接:http://codeforces.com/problemset/problem/235/B

    B. Let's Play Osu!
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. For each click there are two outcomes: correct or bad. Let us denote correct as "O", bad as "X", then the whole play can be encoded as a sequence of n characters "O" and "X".

    Using the play sequence you can calculate the score for the play as follows: for every maximal consecutive "O"s block, add the square of its length (the number of characters "O") to the score. For example, if your play can be encoded as "OOXOOOXXOO", then there's three maximal consecutive "O"s block "OO", "OOO", "OO", so your score will be 22 + 32 + 22 = 17. If there are no correct clicks in a play then the score for the play equals to 0.

    You know that the probability to click the i-th (1 ≤ i ≤ n) click correctly is pi. In other words, the i-th character in the play sequence haspi probability to be "O", 1 - pi to be "X". You task is to calculate the expected score for your play.

    Input

    The first line contains an integer n (1 ≤ n ≤ 105) — the number of clicks. The second line contains n space-separated real numbersp1, p2, ..., pn (0 ≤ pi ≤ 1).

    There will be at most six digits after the decimal point in the given pi.

    Output

    Print a single real number — the expected score for your play. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

    Examples
    input
    3
    0.5 0.5 0.5
    output
    2.750000000000000
    input
    4
    0.7 0.2 0.1 0.9
    output
    2.489200000000000
    input
    5
    1 1 1 1 1
    output
    25.000000000000000
    Note

    For the first example. There are 8 possible outcomes. Each has a probability of 0.125.

    • "OOO"  →  32 = 9;
    • "OOX"  →  22 = 4;
    • "OXO"  →  12 + 12 = 2;
    • "OXX"  →  12 = 1;
    • "XOO"  →  22 = 4;
    • "XOX"  →  12 = 1;
    • "XXO"  →  12 = 1;
    • "XXX"  →  0.

    So the expected score is 

    其实和上一题一样,就是变成平方了而已。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define maxn 100005
     7 using namespace std;
     8 int n;
     9 typedef double ld;
    10 ld ans,p[maxn],f[maxn],e1[maxn];
    11 int main(){
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++)scanf("%lf",&p[i]);
    14     for(int i=1;i<=n;i++){
    15         f[i]=p[i]*(1+2*e1[i-1]);
    16         e1[i]=p[i]*(e1[i-1]+1);
    17     }
    18     for(int i=1;i<=n;i++)ans+=f[i];
    19     printf("%.12lf
    ",ans);
    20     return 0;
    21 }
    View Code
  • 相关阅读:
    公司技术的确定
    数据结构
    如何利用百度ocr实现验证码自动识别
    redis 主从复制
    redis哨兵机制
    redis集群搭建
    webmagic自定义存储(mysql、redis存储)
    redis安装与使用
    maven插件mybatis-generator自动生成代码
    python 中的“集合”(list、tuple、set、dict)
  • 原文地址:https://www.cnblogs.com/longshengblog/p/5789769.html
Copyright © 2020-2023  润新知