题解 B3753 堆栈计算机
思路一
我们需要使栈中所有元素之和为
最简单的方法是直接往栈中放
为了使操作次数尽可能少,我们需要最大化单次的收益。收益指让栈中的元素之和增加了多少。
- 操作
\mathtt{1} ,收益为1 。 - 操作
\mathtt{dup} ,收益为top 。 - 操作
\mathtt{add} ,收益为0 。
第一次操作一定是操作
将
能够获得
代码和提交记录
#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
using namespace std;
int n;
bool f=1;
void make(int x){
puts("1");
while((x>>1)>0){
x>>=1;
puts("dup");
puts("add");
}
}
int main(){
scanf("%d",&n);
while(n){
make(lowbit(n));
if(f)f=0;
else puts("add");
n-=lowbit(n);
}
return 0;
}
思路二
先看一个例子。
输入:
6
我们的代码会从
如果我们将制作出的
这时我突然想到了快速幂的思想。我们一个变量记录栈顶元素,不停地对其进行
代码和提交记录
#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
using namespace std;
int n;
int x=1;
int cnt=-1;
bool f=1;
int main(){
scanf("%d",&n);
puts("1");
while(x<n){
cnt+=bool(x&n);//记录一下最终要加几个数
if(x&n)puts("dup");//赋值保存下来
n-=n&x;//将这一位变为0
x<<=1;
if(x<=n)puts("dup\nadd");//继续增长
}
while((cnt--)>=0)puts("add");
return 0;
}