首页 > 其他分享 >题解:AT_abc376_c [ABC376C] Prepare Another Box

题解:AT_abc376_c [ABC376C] Prepare Another Box

时间:2024-10-20 18:11:06浏览次数:9  
标签:Box 10 ch return Prepare 箱子 int 题解 le

很好的一道二分答案题。

听说 CSP 考前写 tj 可以让 rp += inf?

注:下文中 \(w\) 指物品重量序列,\(x\) 指箱子容量序列。


先问个问题:为什么我上来就敢肯定这是个二分答案题?

或者说,单调性在哪儿?

非常简单:如果一个盒子的容量越大,能装下的东西就更多(废话)。那么如果 \(v\) 不够用,可以扩大容量变成 \(v + 1, v + 2 \cdots 10^9\)。因为 \(10^9\) 是上限不能再大了。

所以就可以准备二分啦~


问2:你怎么 check 这个答案呢?

题目告诉我们,一共只有 \(n\) 个箱子,而物品也有 \(n\) 个,而且一个箱子最多放一个物品,因此物品与箱子必须一一对应,不可以有空箱子

其次,只有 \(w_i \le x_j\) 时第 \(i\) 个物品才能放进第 \(j\) 个箱子。那么结论就出来,排完序之后,要求对于 \(\forall 1 \le i \le n\),要求 \(w_i \le x_i\),否则会导致箱子空掉,然后就不满足刚才的条件了 QaQ。

所以,思路就出来了:

  1. 二分新增箱子容量

  2. 扫一遍,看看新增后是否合法

总的时间复杂度是 \(O(n \log k)\),其中 \(k = 10 ^ 9\)。

然后,然后就结束啦~


ACCode:

/*Code by Leo2011*/
#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define EPS 1e-8
#define FOR(i, l, r) for (int(i) = (l); (i) <= (r); ++(i))
#define log printf
#define IOS                      \
	ios::sync_with_stdio(false); \
	cin.tie(nullptr);            \
	cout.tie(nullptr);

using namespace std;

typedef __int128 i128;
typedef long long ll;
typedef pair<int, int> PII;

const int N = 2e5 + 10;
int n, a[N], b[N], c[N];

template <typename T>

inline T read() {
	T sum = 0, fl = 1;
	char ch = getchar();
	for (; !isdigit(ch); ch = getchar())
		if (ch == '-') fl = -1;
	for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
	return sum * fl;
}

template <typename T>

inline void write(T x) {
	if (x < 0) {
		putchar('-'), write<T>(-x);
		return;
	}
	static T sta[35];
	int top = 0;
	do { sta[top++] = x % 10, x /= 10; } while (x);
	while (top) putchar(sta[--top] + 48);
}

int chk(int q) {
	b[n] = q;
	sort(b + 1, b + n + 1);
	FOR(i, 1, n) if (a[i] > b[i]) {
		for (int j = 1; j < n; ++j) b[j] = c[j];
    // 注意要清空数组,因为排序会打乱顺序,因此不能直接将b[n]设为0,只能新开数组重新复制了 QwQ
		return false;
	}
	for (int j = 1; j < n; ++j) b[j] = c[j];
	return true;
}

int main() {
	n = read<int>();
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for (int i = 1; i < n; i++) scanf("%d", &b[i]), c[i] = b[i];  // 是<哦~
	sort(a + 1, a + n + 1);
	int l = 1, r = 1e9, ret = -1;  // 要求箱子是正整数个,从 1 开始
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (chk(mid)) {
			ret = mid;
			r = mid - 1;
		} else l = mid + 1;
	}
	write<int>(ret);
	return 0;
}

AC 记录~

理解万岁!

标签:Box,10,ch,return,Prepare,箱子,int,题解,le
From: https://www.cnblogs.com/leo2011/p/18487573

相关文章

  • 【学校训练记录】10月个人训练赛4个人题解
    A:要使s,t相等只要互相删除对方没有的字母即可,即找到a-z字母拥有最少的#include<bits/stdc++.h>#defineendl"\n"#defineintlonglongusingnamespacestd;strings1,s2;inta1[30],a2[30];voidsolve(){ cin>>s1>>s2; for(inti=0;i<s1.size(......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • 【洛谷 P1116】车厢重组 题解(模拟+冒泡排序)
    车厢重组题目描述在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他......
  • CF1187E 题解
    Titletranslation给定一棵\(n\)个点的树,初始全是白点。要做\(n\)步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值。第一次操作可以任意选点,求可获得的最大权值。Solution如何让这道题秒降绿题呢?先简化一......
  • 题解:AT_abc376_c [ABC376C] Prepare Another Box
    这道题要求把\(a\)数组和\(b\)数组一一匹配,且要求无法匹配的数量最多为一,并且这个无法匹配的元素最小。可以注意到我们把两个数组排序以后一一对应以后如果出现一个无法匹配的元素,那么这一定就是答案。但是如果我们从小到大枚举,会发现最后剩下的元素不一定最小,所以我们选择......
  • abc376C Prepare Another Box
    有N个玩具,大小分别为A[i];另外有N-1个盒子,大小分别为B[i]。现要再买一个盒子,把所有玩具装到盒子里,要求每个玩具都装一个盒子,并且玩具大小不超过盒子大小。问买的盒子至少为多大?如果无法满足,输出-1。2<=N<=2E5,1<=A[i],B[i]<=1E9分析:将玩具按从大到小排序再依次处理,每次用不小于......
  • JDBC:Statement和PreparedStatement的区别分析
    StatementStatement用于执行静态的SQL查询,通常在SQL语句不会频繁变化的情况下使用。特点不支持参数化查询:SQL语句直接嵌入在代码中,在语句中添加参数较为麻烦。存在SQL注入风险:由于直接拼接字符串,容易受到SQL注入攻击。性能较低:每次执行SQL语句时,数据库都需要......
  • 【题解】「COCI 2018」Teoretičar
    LinkofThisProblem根据Vizing定理,最小的答案就是二分图的最大度数。同时可以在\(O(nm)\)的时间复杂度内构造出一组解。显然对于这道题我们需要更高效的做法。注意到\(2\)的整数次幂,考虑分治。既然答案跟最大度数有关,如果我们每次能把边集分为两个集合,认为她们的颜色......
  • ICPC 2021–2022,NERC – 北欧欧亚总决赛题解翻译
    原文链接ICPC2021–2022,NERC–北欧欧亚总决赛题解翻译圣彼得堡,阿拉木图,巴尔瑙尔,明斯克,埃里温,2022年4月13日问题A.可接受的地图(AdmissibleMap)问题作者和开发者:IlyaZban我们称形如“RLRL...RL”的任何字符串为平凡字符串。引理任何非平凡字符串最多只能有一个构成......
  • [ABC376E] Max × Sum 题解
    [ABC376E]Max×Sum题解原题链接洛谷链接一道简单的推性质题,首先明确一个性质,子集是非连续的,所以在计算时并不用连续区间求。拿过题来,首先想的是枚举\(B\)的最小子集,但其复杂度为\(O(C_N^K)\)复杂度过高,不足以通过本题。于是转变思路,枚举\(A\)之中的最大值。若\(a_i......