• UVA 10328 Coin Toss


    Coin Toss

    Time Limit: 3000ms
    Memory Limit: 131072KB
    This problem will be judged on UVA. Original ID: 10328
    64-bit integer IO format: %lld      Java class name: Main
     

    Toss is an important part of any event. When everything becomes equal toss is the ultimate decider. Normally a fair coin is used for Toss. A coin has two sides head(H) and tail(T). Superstition may work in case of choosing head or tail. If anyone becomes winner choosing head he always wants to choose head. Nobody believes that his winning chance is 50-50. However in this problem we will deal with a fair coin and n times tossing of such a coin. The result of such a tossing can be represented by a string. Such as if 3 times tossing is used then there are possible 8 outcomes.


    HHH HHT HTH HTT THH THT TTH TTT

    As the coin is fair we can consider that the probability of each outcome is also equal. For simplicity we can consider that if the same thing is repeated 8 times we can expect to get each possible sequence once.

    The Problem

    In the above example we see 1 sequnce has 3 consecutive H, 3 sequence has 2 consecutive H and 7 sequence has at least single H. You have to generalize it. Suppose a coin is tossed n times. And the same process is repeated 2^n times. How many sequence you will get which contains a consequnce of H of length at least k.

    The Input

    The input will start with two positive integer, n and k (1<=k<=n<=100). Input is terminated by EOF.

    The Output

    For each test case show the result in a line as specified in the problem statement.

    Sample Input

    4 1
    4 2
    4 3
    4 4
    6 2

    Sample Output

    15
    8
    3
    1
    43

    解题:解题思路跟zoj 3747 一样

    dp[i][0] 表示连续u个正面 且第i个是正面的方案数

    需要注意的是 这道题目是需要用大数的,也就是需要高精度

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 typedef long long LL;
      4 #define MAXN 100
      5 struct HP {
      6     int len,s[MAXN];
      7     HP() {
      8         memset(s,0,sizeof(s));
      9         len=1;
     10     }
     11     HP operator =(const char *num) { //字符串赋值
     12         len=strlen(num);
     13         for(int i=0; i<len; i++) s[i]=num[len-i-1]-'0';
     14     }
     15 
     16     HP operator =(int num) { //int 赋值
     17         char s[MAXN];
     18         sprintf(s,"%d",num);
     19         *this=s;
     20         return *this;
     21     }
     22 
     23     HP(int num) {
     24         *this=num;
     25     }
     26 
     27     HP(const char*num) {
     28         *this=num;
     29     }
     30 
     31     string str()const { //转化成string
     32         string res="";
     33         for(int i=0; i<len; i++) res=(char)(s[i]+'0')+res;
     34         if(res=="") res="0";
     35         return res;
     36     }
     37 
     38     HP operator +(const HP& b) const {
     39         HP c;
     40         c.len=0;
     41         for(int i=0,g=0; g||i<max(len,b.len); i++) {
     42             int x=g;
     43             if(i<len) x+=s[i];
     44             if(i<b.len) x+=b.s[i];
     45             c.s[c.len++]=x%10;
     46             g=x/10;
     47         }
     48         return c;
     49     }
     50     void clean() {
     51         while(len > 1 && !s[len-1]) len--;
     52     }
     53 
     54     HP operator *(const HP& b) {
     55         HP c;
     56         c.len=len+b.len;
     57         for(int i=0; i<len; i++)
     58             for(int j=0; j<b.len; j++)
     59                 c.s[i+j]+=s[i]*b.s[j];
     60         for(int i=0; i<c.len-1; i++) {
     61             c.s[i+1]+=c.s[i]/10;
     62             c.s[i]%=10;
     63         }
     64         c.clean();
     65         return c;
     66     }
     67 
     68     HP operator - (const HP& b) {
     69         HP c;
     70         c.len = 0;
     71         for(int i=0,g=0; i<len; i++) {
     72             int x=s[i]-g;
     73             if(i<b.len) x-=b.s[i];
     74             if(x>=0) g=0;
     75             else {
     76                 g=1;
     77                 x+=10;
     78             }
     79             c.s[c.len++]=x;
     80         }
     81         c.clean();
     82         return c;
     83     }
     84     HP operator / (const HP &b) {
     85         HP c, f = 0;
     86         for(int i = len-1; i >= 0; i--) {
     87             f = f*10;
     88             f.s[0] = s[i];
     89             while(f>=b) {
     90                 f =f-b;
     91                 c.s[i]++;
     92             }
     93         }
     94         c.len = len;
     95         c.clean();
     96         return c;
     97     }
     98     HP operator % (const HP &b) {
     99         HP r = *this / b;
    100         r = *this - r*b;
    101         return r;
    102     }
    103 
    104     HP operator /= (const HP &b) {
    105         *this  = *this / b;
    106         return *this;
    107     }
    108 
    109 
    110     HP operator %= (const HP &b) {
    111         *this = *this % b;
    112         return *this;
    113     }
    114 
    115     bool operator < (const HP& b) const {
    116         if(len != b.len) return len < b.len;
    117         for(int i = len-1; i >= 0; i--)
    118             if(s[i] != b.s[i]) return s[i] < b.s[i];
    119         return false;
    120     }
    121 
    122     bool operator > (const HP& b) const {
    123         return b < *this;
    124     }
    125 
    126     bool operator <= (const HP& b) {
    127         return !(b < *this);
    128     }
    129 
    130     bool operator == (const HP& b) {
    131         return !(b < *this) && !(*this < b);
    132     }
    133     bool operator != (const HP &b) {
    134         return !(*this == b);
    135     }
    136     HP operator += (const HP& b) {
    137         *this = *this + b;
    138         return *this;
    139     }
    140     bool operator >= (const HP &b) {
    141         return *this > b || *this == b;
    142     }
    143 
    144 
    145 };
    146 
    147 istream& operator >>(istream &in, HP& x) {
    148     string s;
    149     in >> s;
    150     x = s.c_str();
    151     return in;
    152 }
    153 
    154 ostream& operator <<(ostream &out, const HP& x) {
    155     out << x.str();
    156     return out;
    157 }
    158 const int maxn = 110;
    159 HP dp[maxn][2];//dp[i][0]表示第i个正
    160 int n,k;
    161 HP solve(int u){
    162     dp[0][0] = 1;
    163     dp[0][1] = 0;
    164     for(int i = 1; i <= n; ++i){
    165         if(i <= u) dp[i][0] = dp[i-1][0] + dp[i-1][1];
    166         if(i == u + 1) dp[i][0] = dp[i-1][0] + dp[i-1][1] - 1;
    167         if(i > u + 1) dp[i][0] = dp[i-1][0] + dp[i-1][1] - dp[i - u - 1][1];
    168         dp[i][1] = dp[i-1][0] + dp[i-1][1];
    169     }
    170     return (dp[n][0] + dp[n][1]);
    171 }
    172 int main(){
    173     while(~scanf("%d%d",&n,&k))
    174         cout<<solve(n) - solve(k-1)<<endl;
    175     return 0;
    176 }
    View Code
  • 相关阅读:
    文件上传笔记
    使用customize-cra,react-app-rewired扩展create-react-app
    regeneratorRuntime is not defined报错处理
    gulp使用笔记
    pyinstaller打包带图标时报错问题
    不使用npm eject 修改create-react-app的wepack配置less-loader
    mockjs使用笔记
    树莓派安装TPLINK_WN725n v2网卡驱动
    csv数据文件如何设置
    Jmeter多线程token传递
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4788726.html
Copyright © 2020-2023  润新知