NOIP模拟 #1题解(持续更新

在这里插入图片描述
在这里插入图片描述
正着想,肯定不得好死,后面的操作影响前面的数字

但是反着想,我们的行为变成了:

每次可以对队列最后的数字进行 − 1 -1 1 ÷ 2  且会使前面的数字整体  + 1 \div 2\ 且会使前面的数字整体\ +1 ÷2 且会使前面的数字整体 +1 等操作
如何构造使得队列中元素都变成 0 0 0

这就很好想:我们从后往前一个个消灭,每一次 + + + 操作给全局tag + 1 +1 +1

这道题成功在赛时唐出来了——(难绷

AC-code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int tag = 0;
string t = "";
string opt[2] = {"1+","c+"};
void get(int x) {
	string s = "";
	int p = x;
	x >>= 1;
	bool flag = true;
	while(x) {
		s = opt[1] + s;
		tag++;
		if(x & 1 && x > 1) s = opt[0] + s,tag++;
		x >>= 1;
	}
	if(p & 1) s = s + "1+",tag++;
	
	s = "1" + s;
	t = s + t;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	freopen("polaris.in","r",stdin);
	freopen("polaris.out","w",stdout);
	int n;
	cin>>n;
	vector<int> b(n + 1);
	for(int i = 1;i<=n;i++) 
		cin>>b[i];
	for(int i = n;i >= 1;i--) 
		get(b[i] + tag);
	cout<<t;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值