zoukankan      html  css  js  c++  java
  • Codeforces 351B Jeff and Furik:概率 + 逆序对【结论题 or dp】

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

    题意:

      给你一个1到n的排列a[i]。

      Jeff和Furik轮流操作,Jeff先手。

      Jeff每次会交换a[i]>a[i+1]的两个数。

      Furik每次有1/2的概率交换a[i]<a[i+1]的两个数,有1/2的概率交换a[i]>a[i+1]的两个数。

      当这个排列变成升序时,游戏停止。

      问你操作数的期望。

    题解:

      假设原序列中有t个逆序对。

      那么将这个序列变成升序,就是将这t个逆序对一个个消除。

      

      Jeff每次会减少一个逆序对。

      Furik每次有1/2概率增加一个逆序对,有1/2概率减少一个逆序对。

      加起来就是:每两次操作,有1/2概率减少两个逆序对,有1/2概率不变。

      也就是:每两次操作,一定会减少一个逆序对。

      

      然而在最后一个回合中,有可能Jeff操作完后,游戏就已经结束了,不用Furik再操作。

      当且仅当逆序对个数t为奇数时,上面的情况成立,操作数-1。

      所以最终答案为:t*2 - (t&1)

      

      另外这道题也可以递推求期望,通项公式就是上面这个,原理一样的。

      还有保留6位小数什么的,不存在的,重点是求逆序对QAQ……

    AC Code:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #define MAX_N 3005
     5 #define INF 1000000000
     6 
     7 using namespace std;
     8 
     9 int n,t=0;
    10 int a[MAX_N];
    11 int l[MAX_N];
    12 int r[MAX_N];
    13 
    14 void merge(int lef,int mid,int rig)
    15 {
    16     int n1=mid-lef+1;
    17     int n2=rig-mid;
    18     for(int i=0;i<n1;i++) l[i]=a[lef+i];
    19     for(int i=0;i<n2;i++) r[i]=a[mid+i+1];
    20     l[n1]=r[n2]=INF;
    21     for(int i=0,j=0,k=lef;k<=rig;k++)
    22     {
    23         if(l[i]<=r[j]) a[k]=l[i++];
    24         else a[k]=r[j++],t+=n1-i;
    25     }
    26 }
    27 
    28 void merge_sort(int lef,int rig)
    29 {
    30     if(lef==rig) return;
    31     int mid=(lef+rig)>>1;
    32     merge_sort(lef,mid);
    33     merge_sort(mid+1,rig);
    34     merge(lef,mid,rig);
    35 }
    36 
    37 int main()
    38 {
    39     cin>>n;
    40     for(int i=0;i<n;i++) cin>>a[i];
    41     merge_sort(0,n-1);
    42     cout<<t*2-(t&1)<<".000000"<<endl;
    43 }
  • 相关阅读:
    webuploader 上传文件参数设置
    数据库报插入异常
    System.Threading.Timer 定时器的用法
    JSON 获取属性值的方法
    JAVA Socket 编程学习笔记(二)
    JAVA Socket 编程学习笔记(一)
    JAVA 判断Socket 远程端是否断开连接
    JAVA 多线程和并发学习笔记(四)
    JAVA 多线程和并发学习笔记(三)
    巧用transform实现HTML5 video标签视频比例拉伸
  • 原文地址:https://www.cnblogs.com/Leohh/p/8196154.html
Copyright © 2011-2022 走看看