• [模拟] JZOJ P3767 A+B


    Description

    对于每个数字x,我们总可以把它表示成一些斐波拉切数字之和,比如8 = 5 + 3, 而22 = 21 + 1,因此我们可以写成 x = a1 * Fib1 + a2 * Fib2 + a3 * Fib3 + … + an * Fibn, 其中,Fib1 = 1, Fib2 = 2…. Fib[i] = Fib[i – 1] + Fib[I - 2], 且a[n] > 0.那么我们称ai为x的一种斐波拉切表示,由于表示方法有很多种,我们要求最大化a[1…n],即,如果b[1…n]和a[1…m]都可以表示x,若m > n 则a更大,若 m = n, 则从高位到低位比,第一个不同处i,若ai > bi 则a比b大。

    你的任务很简单,给你两个用斐波拉切数最大化表示的两个数字,输出他们相加后用斐波那契最大化表示的数字。

    Input

    两行,分别表示两个数字

    每一行开头一个n,表示长度

    然后紧接着n个数字,为从低位到高位。

    Output

    同输入格式。一行。

    Sample Input

    4 0 1 0 1

    5 0 1 0 0 1

    Sample Output

    6 1 0 1 0 0 1

    Data Constraint

    对于30%的数据 长度 <= 1000

    对于100%的数据 长度 <= 1000000

    题解

    30%做法就是直接将这一串数转换为数字再求和再转换回来,听说王大爷说要高精度
    
    100%做法就是类似于模拟一样
        很容易知道,a[i-2]+a[i-1]=a[i]
        然后我们就可以一个一个往前推就好了
    

    代码

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int n,m,a[2000020],b[2000020],t,x;
    int main()
    {
        scanf("%d",&n); 
        for(int i=1;i<=n;++i) scanf("%d",a+i);
        scanf("%d",&m); 
        for(int i=1;i<=m;++i) scanf("%d",b+i);
        t=x=max(n,m)+30; 
        if (a[1]) b[!b[1]]=1;
        a[1]=0; 
        for(int i=1;i<=t;++i) b[i]+=a[i];
        for(int k=1;(1<<k)<=x;k++)
        {
            for(int i=1;i<=t;i++)
            {
                if(b[i]&&b[i-1])
                {
                    int t=min(b[i],b[i-1]);
                    b[i+1]+=t; 
                    b[i]-=t; 
                    b[i-1]-=t;
                }
            }
            for(int i=++t;i>0;i--)
            {   
                if(b[i]>1)
                { 
                    b[i+1]++; 
                    b[i]-=2;
                    if(i>1) b[i-2]++;
                }
            }
        }
        while(b[t]==0) t--;
        b[1]+=b[0];
        printf("%d ",t); 
        for(int i=1;i<=t;++i) printf("%d ",b[i]);
    }
  • 相关阅读:
    【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
    Codeforces 刷水记录
    【POJ-1390】Blocks 区间DP
    【BZOJ-1656】The Grove 树木 BFS + 射线法
    【BZOJ-1127】KUP 悬线法 + 贪心
    【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
    【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
    【BZOJ-2325】道馆之战 树链剖分 + 线段树
    Codeforces乱刷集合
    【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412219.html
Copyright © 2020-2023  润新知