bzoj 2554 Color

2023-10-07 19:48
文章标签 bzoj color 2554

本文主要是介绍bzoj 2554 Color,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一样?

Input

    一行一个字符串,表示球的颜色
   

Output

 一行表示结果,精确到小数点后1位。

       前排推荐阅读liurunda的题解,写的非常好,我感觉我只需要将如何推代码实现即可了,https://www.cnblogs.com/liu-runda/p/6803126.html。

       话说那样说还是大概要说一下做法的,我们可以枚举最终会成为哪个颜色,算一下成为该颜色的概率,再算一下变成该颜色的期望。

       首先我们先算一下成为该颜色的概率是多少,由于最终颜色固定其他颜色都是干扰颜色了,所以我们可以用dp1[i]表示有i个目标颜色要全变成目标颜色时的概率,那么只有两种可能转移到少一种或多一种,即dp1[i]=0.5dp[i-1]+0.5dp[i+1],我们又有边界条件dp1[0]=0,dp1[n]=1可以通过o(n)的方法来解出来每一个dp1的值,怎么推后文会说,不过这里发现dp1[i]=i/n的结论。

       接着算变成同一种颜色的期望,设dp2[i]表示有i个目标颜色,要全变成目标颜色时的期望步数,由于从不同的i转移到同一种颜色的比重是不一样的,所以我们还要乘上它的比重,我们就可以得到dp2[i]=改变1的期望步数+(i-1更新到答案的比重)*dp2[i-1]+(i+1更新到答案的比重*dp2[i+1]),那么i-1有i-1/n的可能转移到答案,i+1同理,那么i-1的比重就是i-1/(i-1+(i+1)即i-1/2*i。最后需要解决的就是改变1的期望步数,我们总共有n*(n-1)种可能的选法,有2*i*(n-i)的方法是可以变化的,所以那么改变1的期望步数就是1/(2*i*(n-i)/(n*(n-1))顺便设每个i的期望步数为g[i]好了。

       最后我们有了这个方程可以通过类似迭代的方法求得解,因为首先dp2[1]转移到dp2[0]的比重是0,所以我们就能得到dp2[1]=(1+1)/2*dp[2]+g[1],是不是很像kx+b的形式,那么我们就令dp2[i]=k[i]*dp[i+1]+b[i],k[1],b[1]是可知的,那么dp2[i]的方程有dp2[i]=g[i]+ (i-1)/2*i*dp2[i-1]+ (i+1)/(2*i)*dp2[i+1],那么我们把dp2[i-1]的带进去,中间那一项就变成了((i-1)/(2*i)*(k(i-1)*dpi+b(i-1)),常数项与常数项合并,dpi那一项与dpi合并,再将新的dpi的系数除过去,就可以得到新的dp2[i]=k[i]*dp2[i+1]+b[i]了,最后由于dp2[n]=0,所以dp2[n-1]=b[n-1],所以我们一路更新回去,就得到了dp2[1~n]的值了,说的好乱,按我的在纸上画画就可以推出来了。

      p.s.模拟赛暴力随机得了5分

      最后我们用每一个数出现的次数乘上它变成答案的概率求和即可。

      下附AC代码。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 10005
using namespace std;
int n;
char s[maxn];
int cnt[maxn];
double dp[maxn],k[maxn],b[maxn],g[maxn];
int main()
{scanf("%s",s+1); n=strlen(s+1);for(int i=1;i<n;i++){g[i]=(1/((double)(2.0*i*(n-i)/(double)(n*(n-1)))));}b[1]=g[1];k[1]=1.0;for(int i=2;i<n;i++){b[i]=g[i]+(double)(i-1)/(double)(2.0*i)*b[i-1];double temp=(1.0-(((double)(i-1)/(double)(2*i))*k[i-1]));b[i]=b[i]/temp;k[i]=(double)(i+1)/(2.0*i)/temp;}dp[n-1]=g[n-1];for(int i=n;i>=1;i--)dp[i]=k[i]*dp[i+1]+b[i];for(int i=1;i<=n;i++)cnt[s[i]]++;double ans=0.0;for(int i='A';i<='Z';i++)ans+=(dp[cnt[i]]*cnt[i]/n);printf("%.1lf\n",ans);
}


        


这篇关于bzoj 2554 Color的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160043

相关文章

三色标记(Tri-color marking)

维基百科部分 原文 https://en.wikipedia.org/wiki/Tracing_garbage_collection#TRI-COLOR Because of these performance problems, most modern tracing garbage collectors implement some variant of the tri-color ma

HDU 1556 Color the ball (树状数组-- 区间更新,单点求值)

OJ题目 :点这里~~ 与 单点更新,区间求值 稍有不同,需要理解注意。 AC_CODE int n;int num[100002];int lowbit(int x){return x&(-x);}int sum(int x){int ret = 0;while(x > 0){ret += num[x];x -= lowbit(x);}return ret;}void ad

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

[C++] 将LONG类型的color值转换为RGB值

转换原理: The calculation is: (65536 * Blue) + (256 * Green) + (Red) 'Convert RGB to LONG: LONG = B * 65536 + G * 256 + R       'Convert LONG to RGB:  B = LONG \ 65536  G = (LONG - B * 65536) \ 256  R =

记一次解析Pantone Color TCX 色彩码

第一次尝试解析TCX 第二次尝试解析TPG 第三次一次到位TCX&TPG ①打开潘通·中国官网 ②在找寻潘通色彩一栏输入TCX,提交 ③浏览器F12,找到搜索结果所在的div,右键copy element ④文本文档修改文件类型为js,并粘贴上一部的结果,将其赋值给str str='<div class="colorInfo" id="fashionColorDiv"><a class

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

ABAP OOALV 颜色COLOR设置

文章目录 行颜色、列颜色、单元格颜色设置COLOR行颜色设定实现过程运行结果 列颜色的设置实现过程运行结果 设置单元格颜色完成过程运行结果1运行结果2 行颜色、列颜色、单元格颜色设置COLOR 行颜色设定 参考文章:https://blog.csdn.net/Leo520liang/article/details/138697189 实现过程 TYPES: BEG