有一种新型的堆栈计算机,计算机的内存是一个初始为空的数列,计算机支持三种操作:
- 1 - 将整数 1 放入数列的尾部。任意时刻都可执行此操作。
- dup - 将数列尾部的数字复制一份,放入数列尾部。只有数列非空时才能执行此操作。
- add - 取出(并删除)数列尾部的两个数字,相加后放回数列的尾部。只有数列中至少有两个数字时才能执行此操作。
给定一个正整数,你需要输出一个长度不超过 200200 的程序(操作的序列),它在执行结束后,恰好得到一个长度为 11 的数列,并且数列中的数字恰好为 n。下图展示了一个最终得到 88 的程序。
说明/提示
对于 60% 的测试数据,有 。
对于 100% 的测试数据,有 。
思路:
例如9,转二进制后是
1001二进制等于2的3次方加上2的0次方(1)。
1.末尾加上1
2.得到2的2次方——4
3.得到2的3次方——8
4.在末尾加上1
5.合并得到9
需要5步
先转二进制:
//AC 20%
#include <bits/stdc++.h>
using namespace std;
int n;
int ansl[105];
int ans[105][105];
int main(){
cin>>n;
//计算最高位是啥=看看是2的几次方
int top=0;
int n1=n;
while(n1!=0){
n1/=2;
top++;
}
top--;
//转二进制
int arr[top+1];
n1=n;
int pos=top;
while(n1!=0&&pos>=0){
arr[top-pos]=n1%2;
n1/=2;
pos--;
}
if(top>0){
cout<<"1"<<endl;
cout<<"1"<<endl;
cout<<"add"<<endl;
for(int i=1;i<top;i++){
if(arr[i]==1){
ansl[top-i-1]+=2;
ans[top-i-1][ansl[top-i-1]-2]=1;//1
ans[top-i-1][ansl[top-i-1]-1]=2;//add
}
ansl[i]+=2;
ans[i][ansl[i]-2]=3;//dup
ans[i][ansl[i]-1]=2;//add
}
}
for(int i=0;i<top;i++){
for(int j=0;j<ansl[i];j++){
if(ans[i][j]==1){
cout<<"1"<<endl;
}
else if(ans[i][j]==2){
cout<<"add"<<endl;
}
else if(ans[i][j]==3){
cout<<"dup"<<endl;
}
}
}
if(arr[0]==1&&top>0){//其实arr[0]如果放到上面程序去做的话就是ans[top+0][...]
cout<<"1"<<endl;
cout<<"add"<<endl;
}
if(top==0){
cout<<"1"<<endl;
}
return 0;
}
但只拿到了20分~