[ZJOI2012]数列

超级水的题还wa了一次

首先很容易发现其实就只有两个值并存

然后 要注意把数组初始化啊。。。可能后面有多余的元素(对拍的时候由于从小到大就没跑出错)

#include <bits/stdc++.h>
using namespace std;
int a[170],b[170],a1[170],a2[170],x1[170],x2[170];
bool t;
char s[170];
void cf(int *a)
{
    int x=0;
    for (int i=150;i>=1;i--)
    {
        b[i]=(x*10+a[i])/2;
        x=(x*10+a[i])%2;
    }
    memcpy(a,b,sizeof(b));
}
void calc1(int *a,int *b)
{
    int x=1;
    for (int i=1;i<=150;i++)
    {
      b[i]=(a[i]+x)%10;
      x=(a[i]+x)/10;
    }
}
void calc2(int *a,int *b)
{
    int x=1;
    for (int i=1;i<=150;i++)
    {
        if (x==1)
        {
            if (a[i]==0) b[i]==9;
            else b[i]=a[i]-1,x=0;
        } else b[i]=a[i];
    }
}
int pd(int *a)
{
    int u=0;
    for (int i=150;i>=2;i--)
      if (a[i]>0) u=9;
    if (!u)
    {
      if (a[1]==0) return(0);
      else if (a[1]==1) return(1);
    }
    return(2);
}
void cc(int *a1,int *a2)
{
    int x=0;
    for (int i=1;i<=150;i++)
    {
      b[i]=(a1[i]+a2[i]+x)%10;
      x=(a1[i]+a2[i]+x)/10;
    }
    memcpy(a1,b,sizeof(b));
}
void dfs()
{
    while (true)
    {
    int tmp=pd(a1);
    if (tmp==0)
    {
        memcpy(x1,x2,sizeof(x2));
        return ;
    } else if (tmp==1)
    {
        cc(x1,x2);
        return ;
    }
    if (!pd(x2))
    {
        if (a1[1]%2==0) cf(a1); else
        {
           cf(a1);
           calc1(a1,a2); 
           memcpy(x2,x1,sizeof(x1));
        }
    } else
    {
        if (a1[1]%2==0)
        { 
            cf(a1);
            calc1(a1,a2);
            cc(x1,x2);
        } else
        {
            cf(a2);
            calc2(a2,a1); 
            cc(x2,x1);
        }
    }
    }
}
int main()
{
    int T;
    cin>>T;
    for (int i=1;i<=T;i++)
    {
        cin>>s;
        memset(a,0,sizeof(a));
        for (int i=0;i<strlen(s);i++)
          a[i+1]=s[strlen(s)-i-1]-'0';
        memset(x1,0,sizeof(x1));
        memset(x2,0,sizeof(x2));
        x1[1]=1; 
        memcpy(a1,a,sizeof(a));
        dfs();
        int j;
        for (j=150;j;j--) if (x1[j]) break;
        for (int k=j;k;k--) cout<<x1[k];
        if (j==0) cout<<0;
        cout<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/8556106.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值