题目链接:
题目大意:
给出一个游戏,先手选择一对相邻的数交换位置,后手随机找一对数,然后掷硬币决定是否交换,如果不能交换,那么就重新找。问大致序列有序的采取最优策略的布数的期望。
题目分析:
- 定义dp[i]表示减少i个逆序对的步数的期望。
- dp[i]=1+1+dp[i?2]?0.5+dp[i?1+1]]?0.5
- 因为先手可以选择,所以它每次一定会采取操作减少一个逆序对。
- 我们得到dp[i] = 4 + dp[i-2],dp[0] = 0 , dp[1] = 1;
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 3007
using namespace std;
int n,a[MAX];
int main ( )
{
while ( ~scanf ( "%d" , &n ) )
{
for ( int i = 0 ; i < n ; i++ )
scanf ( "%d" , &a[i] );
int m = 0;
for ( int i = 1 ; i < n; i++ )
for ( int j = 0 ; j < i ; j++ )
if ( a[j] > a[i] )
m++;
int ans = 0;
if ( m&1 )
ans = 1 + m/2*4;
else ans = m*2;
printf ( "%.7f\n" , (double)ans );
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-12 09:02:36