AT_abc351_c [ABC351C] Merge the balls 题解

题目传送门

题目大意

你有一个空序列和 N N N 个球。第 i i i 个球 ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) 的大小是 2 A i 2^{A_i} 2Ai。

计算 N N N 操作后序列中剩余的球的个数。

你将进行 N N N 次运算。

在第 i i i 次操作中,你将第 i i i 个球添加到序列的最右端,然后重复下面的步骤:

  1. 如果序列中只有一个或更少的球,则结束操作。
  2. 如果序列中最右边的球和第二右边的球大小不同,则结束操作。
  3. 如果序列中最右边的球和第二右边的球大小相同,则拿出这两个球,并在序列的最右端添加一个新球,其大小等于移除的两个球的大小之和。然后回到步骤 1,重复上述过程。

计算 N N N 操作后序列中剩余的球的个数。

解题思路

我们拿到题目一看,可以直接模拟,算法时间复杂度 O ( n ) O(n) O(n)。

首先定义一个 stack,为什么要定义一个栈呢?因为我们可以发现,每次操作都是从序列的最右端取出球,而不关最左端的球的事,所以我们可以将序列的最右端看成栈顶,而最左端可以看做是栈底,于是我们只需要在每次操作时,先将第 i i i 个球入栈,再判断栈的元素个数,然后连续两次出栈,判断两球大小是否相同,最后确定是否将新球入栈即可。

大体思路如上所述,但是还有一个地方困住了一些选手,就是如题所述的第 i i i 个球的大小为 2 A i 2^{A_i} 2Ai,但是 0 ≤ A i ≤ 1 0 9 0\le A_i\le10^9 0≤Ai≤109,那我们肯定不能直接算出 2 A i 2^{A_i} 2Ai 的值,因为存不下这么大的数。我们不难想到在每次操作中只计算 A i A_i Ai 的值,但是这怎么计算呢?我们又得从题目进行分析,题目说了只有在最右端的两球大小相同时才会添加一个大小为拿出的球的大小之和的球,也就是说我们每次计算时,只需要计算 2 × 2 B k 2\times 2^{B_k} 2×2Bk (这里令 B k B_k Bk 为拿走的其中一个球的大小)的值就可以了。而 2 × 2 B k 2\times 2^{B_k} 2×2Bk 就等于 2 B k + 1 2^{B_k+1} 2Bk+1,所以在添加球的时候我们只需要入栈 B k + 1 B_k + 1 Bk+1 即可。

CODE:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
stack<int> s;
int a[200010];
signed main() {
	ios::sync_with_stdio(false);
	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++) {
		s.push(a[i]);
		while (1) {
			if (s.size() <= 1) {
				break;
			}
			int k = s.top();
			s.pop();
			int l = s.top();
			s.pop();
			if (k != l) {
				s.push(l);
				s.push(k);
				break;
			}
			s.push(l + 1);
		}
	}
	cout << s.size();
	return 0;
} 

总结

这道题目主要考察了大家能不能将题目描述转化为栈的操作,总体来说较为简单。

相关推荐
熊猫钓鱼>_>1 分钟前
Seedance 2.0 技术深度解析:重构AI视频生成的世界模型新范式
人工智能·笔记·ai·重构·音视频·变革·sedence2.0
小则又沐风a10 分钟前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a35354138213 分钟前
C++项目如何架构优化
java·c++·架构
天天爱吃肉821820 分钟前
【工程师硬件学习笔记:串口‑总线体系与三电试验室异构系统集成深度实战】
大数据·笔记·python·嵌入式硬件·学习·汽车
键盘会跳舞21 分钟前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
PC2005-cloud23 分钟前
Git学习笔记:GitHub Git Data API 完全指南,用 Go 操控 Git 底层对象
笔记·git·学习
breeze jiang25 分钟前
Next.js App Router 全栈实战:从 SPA 的 SEO 痛点到服务端组件与 Hydration 水合机制
开发语言·javascript·ecmascript
程序员老陆30 分钟前
Qt::WidgetAttribute 常用属性详解
开发语言·qt
YSL07012431 分钟前
数据在内存中的存储
c语言
依然鸣32 分钟前
PTA团体程序设计天梯赛L2真题讲解L2-001-004
经验分享·学习·算法·深度优先·pat考试