题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576

题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率。
(1<=n<=200) ,(0<=m<=1,000,000),(1<=l<=r<=n).
分析:每次从某一个数字到达另外数字的概率为0.5,按概率dp求出到达每个数字的概率,然后枚举从l到r的概率相加即可。
dp[i][j]表示第i次操作落在数字j上的概率,但是不能直接开1000000*200的数组来保存中间结果,这肯定是会爆掉的。
因为每次只需要取上一次的数据,所以可以用滚动数组,开dp[2][200]就行了
注意:w可能比n大,所以要先w%n
这一题卡时限卡的非常紧,代码稍微写挫一点就会超时了。
代码如下:

 #include<stdio.h>
#include<string.h>
double dp[][];
int main()
{
int n,m,l,r,i,t,k,w;
while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF)
{
if(n==&&m==&&l==&&r==)
break;
memset(dp,,sizeof(dp));
dp[][]=;
t=;
while(m--)
{
scanf("%d",&w);
w%=n;
k=t^;
for(i=;i<n;i++)
dp[k][i]=;
for(i=;i<n;i++)
{
if(!dp[t][i]) //时限卡的很紧,加这一句来优化,减少运算次数
continue;
dp[k][(i+w)%n]+=0.5*dp[t][i];
dp[k][(i-w+n)%n]+=0.5*dp[t][i];
}
t=k;
}
double ans=;
for(i=l;i<=r;i++)
ans+=dp[t][i-];
printf("%.4lf\n",ans);
}
return ;
}

最新文章

  1. UE4新手之编程指南
  2. JAVA自动化测试中多数据源的切换
  3. Entity Framework 无法对没有主键的视图映射实体的解决办法
  4. js中的 !!
  5. Linux学习笔记19——信号2
  6. 一个支持实时预览的在线 Markdown 编辑器 - Markdoc
  7. stl的集合set——安迪的第一个字典(摘)
  8. SVM学习资料
  9. 关于c中的inline
  10. DBA 优化法则
  11. Ubuntu16.04安装RealSense SR300驱动
  12. es6 let 和 const
  13. Vue(day2)
  14. jxa快速入门,Javascript已加入AppleScript全家桶
  15. Spark基础-scala学习(五、集合)
  16. 【转载】NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩、机器学习及最优化算法
  17. POJ 3273-Monthly Expense 求分组和的最小的最大值【二分答案】
  18. TensorFlow遇到的问题汇总(持续更新中......)
  19. prompt
  20. PAT 1045 快速排序(25)(STL-set+思路+测试点分析)

热门文章

  1. [webpack]——loader配置
  2. Zabbix实战-简易教程--WEB类--Nginx
  3. SpringBoot日记——登录与拦截器篇
  4. [Selenium]如何通过Selenium实现Ctrl+click,即按住Ctrl的同时进行单击操作
  5. 对最近java基础学习的一次小结
  6. Python之Django基本命令
  7. oracle数据库数据字典应用
  8. 学习python,第三篇:.pyc是个什么鬼?
  9. ats Linux Bridge内联
  10. 某简单易懂的人脸识别 API 的开发环境搭建和简易教程