codeforces Gym
来源:互联网 发布:男士双肩背包推荐 知乎 编辑:程序博客网 时间:2024/05/18 02:24
http://codeforces.com/gym/101190/attachments
题目大意:有n张卡片,每一张卡片有一个初始摆放方式,w代表错误方式,c代表正确方式。每次随意选出最上方的k张卡片,观察第一张,如果第一张错误摆放,则将这k张全部翻转,这k张就不再管了,知道卡片堆为空为止。问最后错误摆放的牌的个数的期望。
题解:我们从后往前考虑,dp[i]表示剩余卡片为i-n的情况下,考虑怎么转移,首先我们能很容易的知道区间里错误摆放的牌的总数。而每一次选出的k张牌是否翻转取决于第一张牌。我们枚举所有大于i的值k,
#include <iostream>#include <string>#include <cstdio>#include <algorithm>#include <string>using namespace std;const int MAXN=1000000+10;string s;double dp[MAXN];double sum[MAXN];double tot[MAXN];double t[MAXN];double tt[MAXN];int main(){ freopen("foreign.in","r",stdin); freopen("foreign.out","w",stdout); cin>>s; int len=s.length(); for(int i=len-1;i>=0;i--){ if(i==len-1&&s[i]=='W') sum[i]=1; else if(s[i]=='W'&&i!=len-1){ sum[i]=sum[i+1]+1; }else if(i!=len-1){ sum[i]=sum[i+1]; } } t[len]=0; tt[len]=0; for(int i=len-1;i>=0;i--){ t[i]=t[i+1]+sum[i]; tt[i]=tt[i+1]+len-i-sum[i]; } dp[len-1]=0; tot[len]=0; for(int i=len-1;i>=0;i--){ dp[i]=tot[i+1]; if(s[i]=='C'){ dp[i]+=(len-i)*(sum[i])-t[i+1]; }else{ dp[i]+=(len-i)*(len-i-sum[i])-tt[i+1]; } dp[i]=dp[i]/(1.0*(len-i)); tot[i]=tot[i+1]+dp[i]; } printf("%.12f\n",dp[0]);}
阅读全文
0 0
- 【Codeforces Gym
- 【codeforces Gym
- codeforces Gym
- codeforces Gym
- codeforces Gym
- codeforces Gym
- Codeforces Gym
- Codeforces Gym
- Codeforces Gym
- codeforces Gym
- Codeforces Gym
- Codeforces Gym
- Codeforces Gym
- [codeforces] Gym
- [codeforces] Gym
- [codeforces] Gym
- [codeforces] Gym
- [codeforces] Gym
- 分享一个Linux性能调优/诊断网站
- linux下进程间通信之管道
- 【Java集合】LinkedHashMap
- 图像与原始字节之间的转换
- Docker入门笔记-1
- codeforces Gym
- 某博主的《Thinking in Java》笔记
- 2017.7.21考试
- 论加速度的重要性
- Shadowsocks
- ls 实现-a,-l,-R参数
- springmvc中的web.xml的配置讲解
- 拷贝构造函数
- Ubuntu下Mysql 5.7.19 root密码重置