0
点赞
收藏
分享

微信扫一扫

AcWing每日一题 社交距离

千行 2022-03-16 阅读 104

由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。

尽管他尽了最大努力使他的 N N N 头奶牛们践行“社交距离”,还是有许多奶牛不幸染上了疾病。

编号为 1 … N 1…N 1N 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 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=R1 ,注意这里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;
}
举报

相关推荐

0 条评论