zoukankan      html  css  js  c++  java
  • HDU 1041

    题意:

    给原始序列1

    给定变化规则是,对于原来的序列每一个0前边插入1,每个1前边插入0.

    问原始序列经过n次变化之后有多少对相邻的0.

    规律题:

    从第二次开始

    当第奇数次变化之后,数量变成原来数量的两倍-1;

    当第偶数次变化之后,数量变成原来数量的两倍+1;

    但是由于数据2^1000次方太大,需要用到大数,屌丝还没学到java对大数的处理,所以只写了一个高精度。

    /*************************************************************************
           > File Name: C.cpp
           > Author: ttpond
           > Created Time: 2015-8-22 15:32:30
    ************************************************************************/
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<queue>
    #include<stack>
    #include<set>
    using namespace std;
    char dp[1005][1005];
    void cal(int pos)
    {
        int len=strlen(dp[pos-1]);
        int mm[1005];
        memset(mm,0,sizeof(mm));
        int tmp;
        for(int i=0;i<len;i++)
        {
            mm[i]+=(dp[pos-1][i]-48)*2;
            mm[i+1]+=mm[i]/10;
            mm[i]=mm[i]%10;
        }
        for(int i=0;i<len+1;i++)
        {
            dp[pos][i]=mm[i]+48;
        }
        if(dp[pos][len]=='0')
            dp[pos][len]=0;
    }
    void add(int pos)
    {
        int len=strlen(dp[pos]);
        int tmp;
        int mm[1005];
        memset(mm,0,sizeof(mm));
        mm[0]=1;
        for(int i=0;i<len;i++)
        {
            mm[i]+=dp[pos][i]-48;
            mm[i+1]=mm[i]/10;
            mm[i]=mm[i]%10;
        }
        for(int i=0;i<len+1;i++)
        {
            dp[pos][i]=mm[i]+48;
        }
        if(dp[pos][len]=='0')
            dp[pos][len]=0;
    }
    void sub(int pos)
    {
        int len=strlen(dp[pos]);
        int mm[1005];
        memset(mm,0,sizeof(mm));
        mm[0]=-1;
        for(int i=0;i<len;i++)
        {
            mm[i]+=dp[pos][i]-48;
            if(mm[i]<0)
            {
                mm[i]+=10;
                mm[i+1]--;
            }
        }
        for(int i=0;i<len;i++)
        {
            dp[pos][i]=mm[i]+48;
        }
        if(dp[pos][len-1]=='0')
            dp[pos][len-1]=0;
    }
    int main()
    {
        memset(dp,0,sizeof(dp));
        dp[1][0]='0';
        dp[2][0]='1';
        dp[3][0]='1';
        bool st=0;
        for(int i=4;i<=1000;i++)
        {
            cal(i);
            if(!st)
            {
                add(i);
            }
            else
            {
                sub(i);
            }
            st=!st;
        }
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            int len=strlen(dp[n]);
            for(int i=len-1;i>=0;i--)
            {
                printf("%c",dp[n][i]);
            }
            printf("
    ");
        }
    }
  • 相关阅读:
    上传附件性能测试
    数据库优化
    电商抢购并发
    JVM gc参数设置与分析
    浅谈性能测试分析
    Linux crontab 定时任务命令详解
    Sqlserver 查询语句性能测试
    Win7 user profile service
    图像预处理
    Pytorch迁移学习
  • 原文地址:https://www.cnblogs.com/tun117/p/4753052.html
Copyright © 2011-2022 走看看