首页 > 代码库 > 【NOI2015模拟8.14】A+B
【NOI2015模拟8.14】A+B
算出十进制值相加后再用斐波那契最大化表示显然接受不了,我们得在序列里找出规律。
这里有两个不难发现的运算法则:
1.如果有连续两位i,i-1是1,那么它们可以“运算”使得第三位i+1是1. 如 0 1 0 1 1 0 = 0 1 0 0 0 1
2.如果这个位i是2,那么它可以使它的后一位i+1和前两位i-2是1. 如 0 0 2 0 0 1 0=1 0 0 1 0 1 0
随便弄上十几次这样就可以了。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int f[10000002],n,x,len1,len2; 5 int main(){ 6 f[0]=0; 7 f[1]=0; 8 f[2]=0; 9 scanf("%d",&len1);10 for (int i=1;i<=len1;i++)11 scanf("%d",&f[i]);12 scanf("%d",&len2);13 for (int i=1;i<=len2;i++){14 int x=0;15 scanf("%d",&x);16 f[i]+=x;17 }18 int qwq=max(len1,len2);19 int qoq=true;20 do{21 qoq=false;22 int qaq=qwq;23 for (int i=2;i<=qwq;i++){24 if ((f[i-1])&&(f[i])){25 f[i+1]++;26 qwq=max(qwq,i+1);27 f[i]--;28 f[i-1]--;29 }30 }31 if (f[1]==2){32 f[2]++;33 f[1]=0;34 }35 if (f[2]==2){36 f[3]++;37 qwq=max(qwq,3);38 f[1]++;39 f[2]=0;40 }41 bool quq=true;42 do{43 quq=false;44 for (int i=3;i<=qaq;i++){45 if (f[i]>=2){46 quq=true;47 f[i+1]++;48 qwq=max(i+1,qwq);49 f[i-2]++;50 f[i]--;51 f[i]--;52 }53 }54 if (quq) qoq=true;55 } while(quq);56 } while(qoq); //直到没修改为止57 printf("%d ",qwq);58 for(int i=1;i<=qwq;i++)59 printf("%d ",f[i]);60 return 0;61 }
【NOI2015模拟8.14】A+B
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。