alice132

 

2026.1.10 作业 - # P9953 [USACO20OPEN] Social Distancing II B

题目描述

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

尽管他尽了最大努力使他的 \(N\) 头奶牛们(\(1\le N\le 1000\))践行“社交距离”,还是有许多奶牛不幸染上了疾病。编号为 \(1\ldots N\) 的奶牛们分别位于一条长直道路上的不同位置(相当于一维数轴),奶牛 \(i\) 位于位置 \(x_i\)。Farmer John 知道存在一个半径 \(R\),任何与一头被感染的奶牛距离不超过 \(R\) 单位的奶牛也会被感染(然后会传染给与其距离 \(R\) 单位内的奶牛,以此类推)。

不幸的是,Farmer John 并不确切知道 \(R\) 的值。他只知道他的哪些奶牛被感染了。给定这个数据,求出起初感染疾病的奶牛的最小数量。

输入格式

输入的第一行包含 \(N\)。以下 \(N\) 行每行用两个整数 \(x\)\(s\) 描述一头奶牛,其中 \(x\) 为位置(\(0\le x\le 10^6\)),\(s\)\(0\) 表示健康的奶牛,\(1\) 表示染病的奶牛,并且所有可能因传播而染病的奶牛均已染病。

输出格式

输出在疾病开始传播之前已经得病的奶牛的最小数量。

输入输出样例 #1

输入 #1

6
7 1
1 1
15 1
3 1
10 0
6 1

输出 #1

3

说明/提示

样例解释 1

在这个例子中,我们知道 \(R<3\),否则位于位置 \(7\) 的奶牛会传染给位于位置 \(10\) 的奶牛。所以,至少 \(3\) 头奶牛初始时已被感染:位于位置 \(1\)\(3\) 的两头奶牛中的一头,位于位置 \(6\)\(7\) 的两头奶牛中的一头,以及位于位置 \(15\) 的奶牛。

题解

最小半径怎么决定:相邻的0和1距离的最小值
怎么确定感染的奶牛的最小数量?感染具有双向性,可以从左到右枚举 \(i\) 是否为感染源。

  1. 存在 $ flg[i-1] ==0$ 并且 $flg[i] == 1 $ ,在 位置 \(i\) , 增加 \(1\) 个感染源。
  2. 两头感染的奶牛距离超过 \(R\) ,必须增加 \(1\) 个感染源。
#include <bits/stdc++.h>
using namespace std;
int n;
struct node{
    int x; bool Flg;
}cow[1002];
int main() {
    cin>>n;
    for (int i=1;i<=n;i++) cin>>cow[i].x>>cow[i].Flg;
    sort(cow+1,cow+1+n,[](node t1,node t2) {return t1.x<t2.x;});
    int R=1e6+1;
    for (int i=1;i<n;i++) {
        if (cow[i+1].Flg ^ cow[i].Flg) R=min(R,cow[i+1].x-cow[i].x);
    }
    if (R==1e6+1) {cout<<0<<endl; return 0;}


    int cnt=0;
    for (int i=1;i<=n;i++) {
        if (cow[i].Flg==1 && cow[i-1].Flg==0) cnt++;
        if (cow[i].Flg && cow[i-1].Flg &&  cow[i].x-cow[i-1].x>=R) cnt++;
    }
    cout<<cnt<<endl;
    return 0;
}

posted on 2026-01-20 21:47  alice_ss  阅读(2)  评论(0)    收藏  举报

导航