首页 > 其他分享 >CF387B 题解

CF387B 题解

时间:2023-09-10 14:11:37浏览次数:36  
标签:数字 题解 复杂度 cin 数组 CF387B 排序 指针

思路分析

因为最终要使得 \(a,b\) 相同,所以我们应该希望让相同的数字尽量相同。所以,我们需要先对 \(a\) 和 \(b\) 进行排序,这样子就可以使用双指针的方法来维护最终值了。

我们定义 \(l\) 指针指向 \(a_l\),\(r\) 指针指向 \(b_r\)。因为题目要求添加数字的次数最少,所以我们希望尽可能地来缩小数字以减少添加数字的次数。所以如果 \(a_l<b_r\),那么我们可以将 \(l\) 增加\(1\),代表我们对于这个数可以采用减少的方法。对于每次操作,我们都需要将 \(r\) 增加 \(1\),是因为我们不能重复地操作 \(b_r\)。

复杂度分析

时间复杂度

整个程序的性能瓶颈在于对所有点进行排序,时间复杂度是 \(\mathcal O(n\log n)\) 的,对于 \(1\le n,m\le3000\) 的范围是丝毫没有问题的。

空间复杂度

我们需要两个数组 \(a\) 和 \(b\) 来存储值,\(a\) 的大小为 \(n\),\(b\) 的大小为 \(m\),所以最终的空间复杂度是 \(\mathcal O(n+m)\),也是没有问题的。

代码实现

#include <bits/stdc++.h>
using namespace std;
int n, m, l, r;
int main() {
	cin >> n >> m;
	vector<int> a(n), b(m);
	for (auto &x : a) cin >> x;
	for (auto &x : b) cin >> x;
	sort(a.begin(), a.end()); // 对a数组排序
	sort(b.begin(), b.end()); // 对b数组排序
	while (l < n && r < m) {
		if (a[l] <= b[r]) l++; // 如果a[l]<=b[r],那么我们只需将b[r]减少,不用添加数字
		r++; // 继续比较下一位
	}
	cout << n - l; // 共有n个数字,去掉减小数字的次数,就是添加数字的次数了
	return 0;
}

标签:数字,题解,复杂度,cin,数组,CF387B,排序,指针
From: https://www.cnblogs.com/IShallReturn/p/CF387B-ti-jie.html

相关文章

  • P9516 题解
    思路分析一道很有洛谷个性的模拟签到题。按照题意,我们只需读入\(a,b,c,d,e\),然后对其进行求和,然后依次根据洛谷咕值系统介绍进行判断即可。这样是不是太没有意思了?今天为大家带来一点干货作为福利!介绍:accumulate()函数!简略分析:这个函数可以求出一段区间内的数字之和。S......
  • P9517 题解
    思路分析我们只需要找到左边第一个大于\(0\)的位置\(l\)与右边第一个大于\(0\)的位置\(r\),输出\(r-l+1\)即可。但是很坑的一点是,如果\(∀i∈[1,n],a_i=0\),那么\(l\)和\(r\)会重合,代码会输出\(1\)!所以,我们需要定义一个\(flag\)来标记是否全部输入为\(0\)。代......
  • UVA11210 题解
    思路分析一道大模拟。一共只有\(34\)种牌,因此可以一次判断是否“听”这些牌。比如,为了判断是否“听”一万,只需要判断自己拿到这张一万后能否可以继续和牌。这样,问题就转化成了给定\(14\)张牌,判断是否可以和牌。为此,我们可以递归求解:首先将两张牌作为“将”,然后每次选\(3\)......
  • UVA1352 题解
    思路分析构造排列表立方体只有\(4\)个,暴力法是可行的。但是如果我们要暴力,首先得清楚一个立方体到底有几种不同的旋转方式。接下来,我们用“姿态”一词代替“旋转方法”。假设\(6\)个面的编号为\(1\sim6\),从中选择一个面作为“顶面”,“顶面”的对面为“底面”。然后我们在......
  • UVA11464 题解
    思路分析暴力枚举?我们可以枚举每个数字变或不变,最后判断整个矩阵是否满足条件。但是,这样做最多需要枚举\(2^{255}≈5\times10^{67}\)中情况,是一定会超时的。大眼观察注意到\(n\le15\),第一行只有不超过\(2^{15}=32768\)种可能,所以第一行的情况是可以枚举的。接下来,根据第......
  • 题解 SP4586 Texas Trip
    首先题目翻译是有问题的,求的不是矩形而是最小的正方形。Solution先考虑一下若正方形的边都只能平行于坐标轴怎么做:找到\(x,y\)方向的坐标最值,那么答案就是\(\max^2\{X_{\max}-X_{\min},Y_{\max}-Y_{\min}\}\)。接下来,若正方形可以是斜着的,我们只需把坐标轴旋转,然后同样找出......
  • 题解 P8389【[COI2021] Izvanzemaljci】
    (本题解的所有图片使用GeometryWidget进行绘制)(一)\(K=1\)情况\(K=1\)是平凡的。(二)\(K=2\)情况显然,对于平面内的两个不交正方形,存在至少一条平行于坐标轴的直线将它们划分到两侧。以直线平行于\(y\)轴为例。考虑按\(x\)轴正方向扫描线。先将点按照\(x\)坐标排序,维......
  • cnpm : 无法加载文件 \npm\cnpm.ps1,因为在此系统上禁止运行脚本。 问题解决
    很久没有弄前端VUE了。最近用到的vscode进行前端摸索。在用NPM的时候,发现有点慢,于是切换到了cnpm。在使用cnpm进行运行的时候报错了。“cnpm:无法加载文件C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅https:/go.mi......
  • 【题解】三连击
    [NOIP1998普及组]三连击思路想一想桶得到三个数之后把每一位依次存入桶然后遍历这个桶,看哪一位为\(0\)代码//语言:C++#include<iostream>#include<cstring>//memsetusingnamespacestd;intmain(){ for(inti=123;i<=987/3;i++) { inta=i,b=2*i,c=3*i; i......
  • P3533 [POI2012] RAN-Rendezvous 题解
    P3533[POI2012]RAN-Rendezvous题目大意:给定外向树森林,每次给定两个起始点,求两个点沿边移动最少步数相遇。\(n\)个点,\(n\)条边,并且每个点有唯一的出边,显然构成了多棵基环树,对于每个基环树分别处理:找出环上的点,因为要求支持求出任意两点距离,前缀和一下即可。对于询问,如果在两......