題解:P9953 [USACO20OPEN] Social Distancing II B

cly312發表於2024-09-16

解決思路:

根據奶牛的位置對陣列進行排序。計算相鄰健康奶牛和感染奶牛之間的最小距離。這個距離值減一用來估計感染傳播的半徑。(確保了感染奶牛之間的距離在當前半徑下不會導致傳播給其他健康奶牛。)

遍歷排序後的奶牛列表,找到每一段連續感染奶牛的區域,並計算這些區域中可能需要的初始感染奶牛的數量。對於每一段連續感染奶牛,檢查其能覆蓋的區域,並增加初始感染奶牛的計數。

程式碼:

#include<bits/stdc++.h>
using namespace std;
struct cow{
	int x;
	bool h;
}a[1010];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].h;
	sort(a+1,a+n+1,[](const cow&a,const cow&b){return a.x<b.x;});
	int mr=INT_MAX;
	for(int i=1;i<n;i++)
		if(a[i].h!=a[i+1].h) mr=min(mr,a[i+1].x-a[i].x);
	mr--;
	int ans=0;
	for(int i=1;i<=n;i++){
		if(a[i].h){
			++i;
			while(i<=n&&a[i].h&&a[i].x-a[i-1].x<=mr)
				++i;
			++ans;
			--i;
		}
	}
	cout<<ans;
}

相關文章