题目链接: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:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 3005
#define INF 1000000000 using namespace std; int n,t=;
int a[MAX_N];
int l[MAX_N];
int r[MAX_N]; void merge(int lef,int mid,int rig)
{
int n1=mid-lef+;
int n2=rig-mid;
for(int i=;i<n1;i++) l[i]=a[lef+i];
for(int i=;i<n2;i++) r[i]=a[mid+i+];
l[n1]=r[n2]=INF;
for(int i=,j=,k=lef;k<=rig;k++)
{
if(l[i]<=r[j]) a[k]=l[i++];
else a[k]=r[j++],t+=n1-i;
}
} void merge_sort(int lef,int rig)
{
if(lef==rig) return;
int mid=(lef+rig)>>;
merge_sort(lef,mid);
merge_sort(mid+,rig);
merge(lef,mid,rig);
} int main()
{
cin>>n;
for(int i=;i<n;i++) cin>>a[i];
merge_sort(,n-);
cout<<t*-(t&)<<".000000"<<endl;
}

Codeforces 351B Jeff and Furik:概率 + 逆序对【结论题 or dp】的更多相关文章

  1. Codeforces 351B Jeff and Furik 概率 | DP

    B. Jeff and Furik time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. Codeforces 351B Jeff and Furik

    http://codeforces.com/problemset/problem/351/B 题意:两个人轮流游戏,先手交换相邻两个数,后手先抛硬币,正面就左大右小换,反面就右大左小换,随机找到一对数 ...

  3. 2018.07.22 bzoj3613: [Heoi2014]南园满地堆轻絮(逆序对结论题)

    传送门 做这道题有一个显然的结论,就是要使这个数列单调不减,就要使所有逆序对保证单调不减,也就是求出所有逆序对的最大差值,然后除以2然后就没了. 代码如下: #include<bits/stdc ...

  4. CodeForces - 987E Petr and Permutations (思维+逆序对)

    题意:初始有一个序列[1,2,...N],一次操作可以将任意两个位置的值互换,Petr做3*n次操作:Alxe做7*n+1次操作.给出最后生成的新序列,问是由谁操作得到的. 分析:一个序列的状态可以归 ...

  5. codeforces 352D - Jeff and Furik【期望dp】

    首先恋人操作过一轮之后逆序对不会变多,所以设f[i]为把i个逆序对消掉的期望次数,f[i]=0.5f[i-2]+0.5f[i]+2,化简然后递推即可 #include<iostream> ...

  6. Codeforces 911 三循环数覆盖问题 逆序对数结论题 栈操作模拟

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  7. codeforces 1269D. Domino for Young (二分图证明/结论题)

    链接:https://codeforces.com/contest/1269/problem/D 题意:给一个不规则的网格,在上面放置多米诺骨牌,多米诺骨牌长度要么是1x2,要么是2x1大小,问最多放 ...

  8. [CF 351B]Jeff and Furik[归并排序求逆序数]

    题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...

  9. CodeForces 352D. Jeff and Furik

    题意:给n个数,第一个人选取相邻两个递降的数交换顺序,第二个人一半的概率选取相邻两个递降的数交换顺序,一半的概率选取相邻两个递增的数交换顺序.两个人轮流操作,求整个数列变成递增数列所需交换次数的期望. ...

随机推荐

  1. 关于.cap文件分析

    CAP文件是比较通用的一种文件格式,基本上大多数抓包软件都支持以此格式将捕获的网络数据包存储下来.    需要说明的是,CAP文件存储下来的,一般都是网络数据帧.不同网络传输协议下的帧格式是有差异的, ...

  2. SQL之经典语句

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  3. 利用socket.io实现消息实时推送

    最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...

  4. Live555 中的客户端openRTSP 保存H264文件

    http://amitapba.blog.163.com/blog/static/20361020720140189239762/ http://amitapba.blog.163.com/blog/ ...

  5. saltstack内置state模块file之append

    添加文件文本在文件尾部 salt.states.file.append(name, text=None, makedirs=False, source=None, source_hash=None, ...

  6. unity回调函数范例

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class callback ...

  7. 在VS中自动生成NuGet包以及搭建自己的或单位内部的NuGet服务器

    关于NuGet的介绍已经很多,可以参考下面的: NuGet学习笔记(1)--初识NuGet及快速安装使用 http://kb.cnblogs.com/page/143190/ NuGet学习笔记(2) ...

  8. Python PhatomJS 和Selenium动态加载页面 获取图片内容

    如果您觉得感兴趣的话,可以添加我的微信公众号:一步一步学Python![](http://images2017.cnblogs.com/blog/993869/201711/993869-201711 ...

  9. Unable to determine IP address from host name

  10. LookAndFeelInfo

    在读zap源码的时候碰到:UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());以下来自百度知道UIManager.s ...