https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1269

题意:一共n张牌,求至少连续k张牌是正面的排列情况有多少种(1<=k<=n<=100)

思路:将至少转换为至多,所有排列情况减去至多连续k-1张牌是正面的排列情况,就可以得到至少k张连续正面的情况了

   所有排列情况好求,就是2^n,要注意到n最多为100,超过了long long的范围,可以用两个long long需要模拟一下。

   至多有x张牌是正面的情况,用s[0][i]表示第i张是反面的时候,至多x张牌连续正面的情况有多少个

                 用s[1][i]表示第i张是正面的时候,至多x张牌连续正面的情况有多少个

  对于反面 s[0][i]=s[0][i-1]+s[1][i-1]   反面与限制条件无关,直接就等于之前的所有情况之和;

  对于正面 如果i<=x  s[1][i]=s[1][i-1]+s[0][i-1]    这时肯定不会出现连续的正面超过i的情况,所有也可以直接等于之前的所有情况之和;

       如果i>x  s[1][i]=s[1][i-1]+s[0][i-1]-s[0][i-k-1]    i>x的时候,第i张如果要放正面,就需要排除之前从i-1到i-k连续k张是正面的那些排列,所有需要排除的情况都在s[0][i-k-1],因为从i-1到i-k的k张连续正面一定是从一个反面(i-k的前一个i-k-1一定是反面)开始的

 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdio.h>
 4 #define ll long long
 5 #define Flag 1000000000000000//大于等于的时候进位
 6 using namespace std;
 7 struct Num//用两个longlong模拟,重载了加减方便计算
 8 {
 9     ll H,L;
10     Num()
11     {
12         H=L=0;
13     }
14     void quan(int n)//求2^n,n张牌所有的排列情况
15     {
16         this->H=0;
17         this->L=1;
18         while(n--)
19         {
20             this->L<<=1;
21             this->H<<=1;
22             if(this->L>Flag)this->L-=Flag,this->H++;
23         }
24     }
25     Num operator +(const Num& b)const
26     {
27         Num tem;
28         tem.L = this->L + b.L;
29         tem.H = this->H + b.H;
30         if(tem.L>=Flag)
31         {
32             tem.H++;
33             tem.L-=Flag;
34         }
35         return tem;
36     }
37     Num operator -(const Num& b)const
38     {
39         Num tem;
40         if(this->L<b.L)
41         {
42             tem.L = this->L + Flag -b.L;
43             tem.H = this->H - b.H - 1;
44         }
45         else
46         {
47             tem.L = this->L - b.L;
48             tem.H = this->H - b.H;
49         }
50         return tem;
51     }
52     void display()//输出
53     {
54         if(this->H)
55         {
56             printf("%lld%015lld\n",this->H,this->L);
57         }
58         else
59         {
60             printf("%lld\n",this->L);
61         }
62     }
63 };
64 Num s[2][101];
65
66 Num que(int n,int k)//求n张牌,最多k个连续正面的情况
67 {
68     s[0][0].L=1;
69     int i=1;
70     while(i<=n)
71     {
72         s[0][i]=s[0][i-1]+s[1][i-1];
73         if(i<=k)
74         {
75             s[1][i]=s[0][i-1]+s[1][i-1];
76         }
77         if(i>k)
78         {
79             s[1][i]=s[0][i-1]+s[1][i-1]-s[0][i-k-1];
80         }
81         i++;
82     }
83     return s[0][i-1]+s[1][i-1];
84 }
85
86 int main()
87 {
88     int n,k;
89     while(cin >> n >> k)
90     {
91         Num q;
92         q.quan(n);
93         q=q-que(n,k-1);//相减得出至少k个正面的情况
94         q.display();
95     }
96     return 0;
97 }

转载于:https://www.cnblogs.com/icfir/p/9084980.html

UVaOJ 10328 Coin Toss相关推荐

  1. 题解 UVA10328 【Coin Toss】

    这道题目其实就是说有N张纸牌,问至少连续K张正面朝上的可能性是多少. 可以用递推做. 首先我们将题目所求从 至少K张 转化为 总数 - 至多K张 (为什么要这样自己想) 设F[i][j]为前i个纸牌至 ...

  2. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  3. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  4. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  5. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  6. 递推DP(至少和至多之间的转换

    UVa 10328 - Coin Toss 题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 转换成抛N次至多连续有N个减去抛N次至多连续有K-1个1的情况 dp[i][k]表 ...

  7. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

  8. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  9. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

  10. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

最新文章

  1. FPGA设计心得(5)Aurora 例子工程分析与仿真实例分析(streaming版)
  2. Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
  3. 转:文件系统read,write缓存,有点意思
  4. python实现qq登录_在django中实现QQ登录
  5. python中json格式数据输出实现方式(无unicode编码输出形式)
  6. .net core 实现基于 JSON 的多语言
  7. 量子科技概念大火,国内现状如何?华为BAT均入局量子计算
  8. 银行大数据新玩法,构建“一湖两库”金融数据湖
  9. OBJECTPROPERTY OBJECT_ID TEXTPTR【转载】
  10. 华为旗下哈勃投资公司入股光刻机制造商科益虹源
  11. (转)30分钟正则表达式入门
  12. arcgis sample代码之SOE示例代码PageLayout REST Server Object Extension 的源码分析
  13. spark官方文档_Spark机器学习之Pipeline
  14. Python如何清屏命令行终端
  15. QQ音乐API爬取全过程
  16. 数据结构初阶——二叉树
  17. Maven私服nexus磁盘空间清理
  18. oracle11g 网页账号,oracle11g 创建用户并受权
  19. Filtered request failed
  20. 使用pandoc 生成带中文的pdf

热门文章

  1. jquery_ui_api中文
  2. 从宠物浴液做一个O2​O项目的设想
  3. 忘记using namespace std;
  4. 如何解决第三方JavaScript引入工程后报错
  5. 已有一个名为“frmadd”的组件。组件的名称必须是唯一的,而且名称必须不区分大小
  6. Win10网络连接面板中突然出现空白一片的解决办法
  7. 让人心烦的TIME_WAIT状态与SO_REUSEADDR选项
  8. 编写高可用Eureka Server
  9. linux 多线程超时中断,c#中的线程超时
  10. 非酋用计算机弹唱,非酋简谱 薛明媛/朱贺 听说爱情就是这样子