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\) 是否为感染源。
- 存在 $ flg[i-1] ==0$ 并且 $flg[i] == 1 $ ,在 位置 \(i\) , 增加 \(1\) 个感染源。
- 两头感染的奶牛距离超过 \(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;
}
浙公网安备 33010602011771号