首页 > 其他分享 >[ARC121B] RGB Matching 题解

[ARC121B] RGB Matching 题解

时间:2024-02-27 19:59:46浏览次数:28  
标签:cnt ch int 题解 back RGB ARC121B 物品 配对

题意

  • 有 \(2N\) 个物品,每个物品有可爱度 \(a_i\) 和颜色 \(c_i\),将其两两配对。假设物体 \(i\) 和 \(j\) 配对,则 \(c_i\neq c_j\),则会增加 \(|a_i-a_j|\) 的不满意度,求最小的不满意度。

分析

  • 这道题可以贪心解决。我们尽量让每一对物品颜色相同,令每种颜色的总个数为 \(cnt_c\),则:
  1. 若 \(cnt_R\)、\(cnt_G\)、\(cnt_B\) 均为偶数,则答案为 \(0\)。
  2. 若 \(cnt_R\) 和 \(cnt_G\) 为奇数(其余情况同理),那么我们将颜色为 R 和 G 的物品个留出一个配对,剩余的物品以相同颜色两两配对;也可以将一个 R 和一个 B 配对,再把一个 G 和一个 B 配对。取这两种情况的最小值即可。
  • 时间复杂度 \(O(n\log n)\)。

AC 代码

#include <bits/stdc++.h>
#define int long long
#define inf 1e18
#define N 200005
using namespace std;
int n;
vector<int> a[4];

inline int read(int &x) {
	char ch = x = 0;
	while (ch < '0' || ch > '9')
		ch = getchar();
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + ch - 48;
		ch = getchar();
	}
	return x;
}

inline int calc(int u, int v) {
	int ans = inf;
	if (a[v].empty()) {
		return ans;
	}
	int lu = a[u].size(), lv = a[v].size(), j = 0;
	for (int i = 0; i < lu; i++) { //求取差值最小的那一对
		while (j + 1 < lv && a[v][j + 1] <= a[u][i]) { //尺取法
			j++;
		}
		ans = min(ans, abs(a[u][i] - a[v][j]));
		if (j + 1 < lv) {
			ans = min(ans, abs(a[u][i] - a[v][j + 1]));
		}
	}
	return ans;
}

signed main() {
	read(n);
	n <<= 1;
	char ch = 0;
	int x;
	for (int i = 1; i <= n; i++) {
		read(x);
		ch = getchar();
		while (ch < 'A' || ch > 'Z') ch = getchar();
		if (ch == 'R') a[1].push_back(x);
		else if (ch == 'G') a[2].push_back(x);
		else a[3].push_back(x);
	}
	vector<int> res;
	for (int i = 1; i <= 3; i++) {
		sort(a[i].begin(), a[i].end());
		if (a[i].size() % 2 == 1) {
			res.push_back(i);
		}
	}
	if (res.empty()) {
		printf("0");
		return 0;
	}
	int u = res[0], v = res[1], w = 6 - u - v;
	int uv = calc(u, v);
	int uw = calc(u, w);
	int vw = calc(v, w);
	printf("%lld", min(uv, uw + vw));
	return 0;
}
  • 感谢观看!留个赞吧~

标签:cnt,ch,int,题解,back,RGB,ARC121B,物品,配对
From: https://www.cnblogs.com/iloveoi/p/18037743

相关文章

  • AT_abc270_g [ABC270G] Sequence in mod P 题解
    [ABC270G]SequenceinmodP博客阅读可能体验更佳题意给出递推式如下,求最小的使\(X_i=G\)成立的\(i\)。\[X_i=\begin{cases}S&i=0\\(A\timesX_{i-1}+B)\bmodp&i\ge1\end{cases}\]分析这里分几种情况来分析:当\(A=0\)时,\(X_i\)要么等于\(S\),要么等于\(B\),直......
  • CF1928C Physical Education Lesson 题解
    洛谷传送门原题传送门题意一种上下波动的数组,给出所在的位置\(n\)和对应的数字\(x\),求出有几种数组满足条件。令\(k\)为最大值,则数组长成这样子:\[1,2,3,\cdots,k-1,k,k-1,k-2,\cdots,2,1,2,3,\cdots\]如图,每\(2(k-1)\)就循环一次。分析因为每\(2(k-1)\)......
  • CF1477A Nezzar and Board 题解
    题意给出数列\(S=\{a_i\}\)和整数\(k\),求是否能通过下面的操作使得\(k\inS\)?操作:选取\(x,y\inS\),将\(2x-y\)加入\(S\)中。分析观察操作可以发现,\(2x-y\)实际上就是数轴上\(y\)关于\(x\)的对称点,因此这个操作只与\(x\)和\(y\)在数轴上的相对位置有关,与......
  • [ABC342D] Square Pair 题解
    洛谷传送门原题传送门题意给出一个数列\(A\),求出满足\(A_iA_j\)为完全平方数的无序数对\((i,j)\)的个数。分析容易想到(但是我在昨晚没想到,可以原地AFO了),对于每个数,如果是\(0\)的话可以直接统计答案(记录\(0\)的个数\(cnt\),最后\(ans\leftarrowans+cnt(n-cnt)+\f......
  • [ABC342E] Last Train 题解
    洛谷传送门原题传送门题意给出一些由\((l,d,k,c,A,B)\)描述的列车,表示每当时间为\(l,l+d,l+2d,\cdots,l+(k-1)d\)时有一半列车从\(A\)出发,经过\(c\)的时间到达\(B\)。问如果从站点\(i,i\in(0,n)\)出发要去站点\(n\),最晚什么时候到达站点\(i\)可以去到站点\(n\)......
  • [ABC342C] Many Replacement 题解
    洛谷传送门原题传送门题意给出由小写字母初始字符串,每次操作将字符串中所有为\(c\)的字符改为\(d\)。输出最终的字符串。分析很明显只需要开一个\(fa\)数组,其中\(fa[i]=j\)表示字母\(i\)被改为了\(j\)。对于每次操作只需要遍历\(26\)个字母,将\(fa[i]=c\)的那些......
  • [ABC341E] Alternating String 题解
    题目传送门原题传送门题意给出长为\(n\)的01串,如果一个子串01交替出现,则称其为“好的”。有\(q\)次询问,把\([x,y]\)中的每一位反转或者询问\([x,y]\)是否是“好的”。分析一眼线段树。用线段树维护区间是否是“好的”,每个节点维护最左段和最右端的值,pushup和q......
  • [ABC342G] Retroactive Range Chmax 题解
    洛谷传送门原题传送门题意维护一个数列,有以下三个操作:区间最值操作,即将\([l,r]\)区间内的\(A_i\)变成\(\max(A_i,v)\)。删除操作操作,即将第\(i\)次操作删除,保证第\(i\)次操作是操作\(1\),且未被删除。注:仅删除第\(i\)次操作,后续操作仍然在。查询,询问当前的......
  • P1013 进制位 题解
    题注题目传送门这篇题解其实是上一篇题解(Llf0703同志)证明过程的完善(其实就是思路一样了啦),来让入门者或追求严谨者对证明过程更加了解。题目分析\(3\leqn\leq9\),也即数字的个数\(N\leq8\)。研究样例发现,\(N\)与进制\(R\),以及数字对应两位数个数\(M\)与数字本身......
  • Pursuit For Artifacts 题解(图论)
    PursuitForArtifacts题解题目给定一张\(n\)个点\(m\)条边的简单无向连通图,边有边权,边权要么为\(0\),要么为\(1\)。每条边只能通过一次(两个方向加起来只能通过一次)。求是否存在一条从\(a\)到\(b\)的路径,满足路径上至少存在一条权为\(1\)的边。\(1\leqn,m\l......