由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。
尽管他尽了最大努力使他的 N N N 头奶牛们践行“社交距离”,还是有许多奶牛不幸染上了疾病。
编号为 1 … N 1…N 1…N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 i i i 位于位置 x i x_i xi。
Farmer John 知道存在一个半径 R R R,任何与一头被感染的奶牛距离不超过 R R R 单位的奶牛也会被感染(然后会传染给与其距离 R R R 单位内的奶牛,以此类推)。
不幸的是,Farmer John 并不确切知道 R R R 的值。
他只知道他的哪些奶牛被感染了。
给定这个数据,求出起初感染疾病的奶牛的最小数量。
输入格式
输入的第一行包含
N
N
N。
以下 N N N 行每行用两个整数 x x x 和 s s s 描述一头奶牛,其中 x x x 为位置, s s s 为 0 0 0 表示健康的奶牛, 1 1 1 表示染病的奶牛,并且所有可能因传播而染病的奶牛均已染病。
输出格式
输出在疾病开始传播之前已经得病的奶牛的最小数量。
数据范围
1≤N≤1000,
0≤x≤106
输入样例:
6
7 1
1 1
15 1
3 1
10 0
6 1
输出样例:
3
分析
每次给定R之后,传染能力也就确定了———或者说连通块个数就确定了,只需要在连通块内部防止一个传染源即可完成任务,因此,传染源个数与R成反比,R与越大,个数越小 因此R取最大值即可,但是不能去到临界值,因为传染是严格大于的,因此
R
m
a
x
=
R
−
1
R_{max} = R-1
Rmax=R−1 ,注意这里R先要去所有有病没病距离的最小值
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int , int> PII;
const int N = 1100;
PII q[N];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; ++ i) cin >> q[i].x >> q[i].y;
sort(q + 1 , q + n + 1);
int R = 1e8;
for (int i = 2; i <= n; ++ i)
if (q[i].y != q[i - 1].y)
R = min(R , q[i].x - q[i - 1].x);
R --;
int res = 0;
for (int i = 1; i <= n; ++ i) 双指针搜一维坐标上的联通块
{
if (q[i].y)
{
res ++;
int j = i + 1;
while(j <= n && q[j].y && q[j].x - q[j - 1].x <= R) j ++;
i = j - 1;
}
}
cout << res << endl;
return 0;
}