Logo FiraCode 的博客

博客

CF14B题解

...
FiraCode
2025-12-01 12:55:17
什么意思呢

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2022-04-10 20:33:40

【题目链接】

思路:

因为数据范围 $a , b \le 1000$ 很小,所以我们可以用一个数组来存一个数他出现的次数。

然后用两个数,储存数的 $l$ 最小值和 $r$ 的最大值。

依次枚举每个数,看看这个数出现的次数是否等与区间个数 $n$,如果是的话,就更新距离。

如果枚举完都没有一个满足条件的,输出 $-1$。

【AC记录】

AC code:

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010 , INF = 0x3f3f3f3f;
int a[N];\/\/存出现个数的数组
int ans = INF;\/\/答案,因为要区最小值,所以设成很大的值
bool t = false;\/\/判断是否输出-1 
int n , k , minl , maxr;
int main(){
	cin >> n >> k;
	for (int i = 1; i <= n; ++ i) {
		int l , r;\/\/区间的左右端点
		cin >> l >> r;
		if (l > r) swap (l , r);\/\/若l比r大,那么交换l,r 
		minl = min (minl , l);\/\/左端点的最小值
		maxr = max (maxr , r);\/\/右端点的最大值
		for (int j = l; j <= r; ++ j)
			a[j] ++;\/\/将这个区间里的数的出现次数++
	}
	for (int i = minl; i <= maxr; ++ i) \/\/枚举每一个数
		if (a[i] == n) {\/\/如果他是公共点
			ans = min (ans , abs(i - k));\/\/更新答案
			t = true;\/\/那么他就有公共节点,不用输出-1,把他设成false 
		}
	if (!t) puts("-1");\/\/如果他们没有公共区间,输出-1。 
	else cout << ans << endl;
	return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。