首页 > 其他分享 >AT_abc254_h [ABC254Ex] Multiply or Divide by 2 题解

AT_abc254_h [ABC254Ex] Multiply or Divide by 2 题解

时间:2023-10-01 14:22:05浏览次数:41  
标签:gets int 题解 top pop push Multiply abc254

打篇题解巩固一下。

题意

给你两个集合 \(A\) 和 \(B\),对于任意 \(A\) 集合中的元素,我们可以进行 \(2\) 种操作:\(a_i\gets \left\lfloor\frac{a_i}{2}\right\rfloor\) 或 \(a_i\gets 2\times a_i\)。问最少要多少次才能使 \(A\) 和 \(B\) 中的元素相等。

分析

首先我们可以令 \(a=\max_A\),\(b=\max_B\)。

  • 若 \(a=b\) 则可以消去 \(2\) 数。之后继续寻找 \(A\) 和 \(B\) 中最大的元素。
  • 若 \(a<b\) 则说明 \(b\) 大于 \(A\) 中全部的元素。\(a\gets 2\times a\) 等价于 \(b\gets \frac{b}{2}\),当且仅当 \(b\) 为 \(2\) 的倍数。
  • 若 \(a>b\) 则说明 \(a\) 大于 \(B\) 中全部的元素。使 \(a\gets \left\lfloor\frac{a}{2}\right\rfloor\)。

最后输出操作次数即可。

注意

要使 \(a_i\gets \left\lfloor\frac{a_i}{2}\right\rfloor\) 等于 \(a_i\gets 2\times a_i\),就必须使 \(a\) 为 \(2\) 的倍数。如果不是,则无解 。

代码实现

这里用优先队列维护 \(A\) 和 \(B\) 的最大值。

#include <bits/stdc++.h>
using namespace std;
int n, ans;
priority_queue<int> A, B;//构建优先队列
int main() {
	cin>>n;
	//存储
	for (int i = 0; i < n; ++i) {
		int a;
		cin >> a;
		A.push(a);
	}
	for (int i = 0; i < n; ++i) {
		int b;
		cin >> b;
		B.push(b);
	}
	while (!A.empty()) {
		if (A.top() < B.top()) {
			if (B.top() % 2) {//判断是否无解
				printf("-1");
				return 0;
			} else {
				int t = B.top();
				B.pop();
				B.push(t / 2);
			}
		} else if (A.top() > B.top()) {
			int temp = A.top();
			A.pop();
			A.push(temp / 2);
		} else {
			A.pop();
			B.pop();
			continue;
		}
		ans += 1;//计数
	}
	cout << ans << endl;
	return 0;
}


标签:gets,int,题解,top,pop,push,Multiply,abc254
From: https://www.cnblogs.com/splay/p/17738815.html

相关文章

  • UVA12655 Trucks 题解
    题目传送门前言中文题目可以看link。前置知识Kruskal重构树|最近公共祖先简化题意给定一个\(N\)个点\(M\)条边的有向图,共有\(S\)次询问,每次询问从\(L\)到\(H\)所有的路径中最小的权值的最大值(多组数据)。本题即最大瓶颈路问题。解法使最小的权值最大,不难......
  • 【洛谷 P1305】新二叉树 题解(结构体数组+先序遍历+二叉树)
    新二叉树题目描述输入一串二叉树,输出其前序遍历。输入格式第一行为二叉树的节点数。()后面行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示输出格式二叉树的前序遍历。样例#1样例输入#16abcbdicj*d**i**j**......
  • SP16113 SUBTLEBA - Trucks Transportation 题解
    题目传送门前言本题样例有问题,如果想要样例可以去vjudge上。本题提交后可能会出现UKE,建议前往link提交,而且本篇题解中所提供的代码也为link代码。前置知识Kruskal重构树|最近公共祖先简化题意给定一个\(N\)个点\(M\)条边的有向图,共有\(S\)次询问,每次询问......
  • 题解 CF1875D【Jellyfish and Mex】
    显然,除非\(\operatorname{mex}a=0\),否则不会删除\(>\operatorname{mex}a\)的数。而\(\operatorname{mex}a=0\)时不对答案产生贡献,因此任意时刻我们都可以忽略\(a\)中\(>\operatorname{mex}a\)的数。又显然,一旦我们开始删一个数,就会先把所有与之相等的数删光。否则,设最先......
  • counting题解
    \(N,M\le1e7\)接着反射容斥,考虑这道题怎么做如果去枚举不动步数,加上反射容斥,直接T飞了把-1/0/1操作转换一下,就成了0/1/2如果没有限制(不能<0或>m),n步方案就是\((1+x+x^2)^n\)设\(H=1+x+x^2\quadF=H^n\)那么对两边求导:\[nH^{n-1}H'=F'\]\[F'H=nFH'\]我们知道\[H=1+x+x^2......
  • 第四周题解
    第四周题解7-1根据后续和中序遍历输出先序遍历利用数组保存树的后序遍历和中序遍历,根据后续遍历和中序遍历的特点还原树,并根据先序遍历的顺序,即根左右,利用函数递归输出打印,注意输出格式的正确性。#include<bits/stdc++.h>usingnamespacestd;constintN=40;typedeflon......
  • vs code调试rust乱码问题解决方案
    在terminal中用chcp65001修改一下字符集,就行了。有的博主推荐修改区域中的设置,这会引来很大的问题。千万不要修改如下设置:......
  • P7167 [eJOI2020 Day1] Fountain 题解
    Description给定\(n\)个从上往下圆心重叠的圆盘,给定每个圆盘的直径\(d_i\)和容量\(c_i\),所有圆盘底下有一个容量为\(\infty\)的水池,编号为\(0\)。\(q\)次询问,每次给定\(r\)和\(v\)表示往第\(r\)个圆盘里倒\(v\)的水,输出水最后流到哪个圆盘会停止。Solution倍......
  • 【题解】CF1110D Jongmah(DP)
    【题解】CF1110DJongmah代码很短,但是思路我怎么也想不到的神仙DP。题意概述你在玩一个叫做Jongmah的游戏,你手上有\(n\)个麻将,每个麻将上有一个在\(1\)到\(m\)范围内的整数\(a_i\)。为了赢得游戏,你需要将这些麻将排列成一些三元组,每个三元组中的元素是相同的或者连......
  • 洛谷题解 | AT_abc321_c Primes on Interval
    目录题目翻译题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2样例#3样例输入#3样例输出#3题目简化题目思路AC代码题目翻译【题目描述】你决定用素数定理来做一个调查.众所周知,素数又被称为质数,其含义就是除了数字一和本身之外不能......