[ZJOI2012]数列
生活随笔
收集整理的這篇文章主要介紹了
[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
總結
以上是生活随笔為你收集整理的[ZJOI2012]数列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux怎么把标准输出重定向其他文件?
- 下一篇: 手机gpu调度模式哪个好?