P9953 [USACO20OPEN] Social Distancing II B

题目分析

这题普普通通的贪心,贪的牛的感染数,想一想,既然当前牛可感染,那么不妨让他感染,反正你不然这头牛感染,后面也会感染(可以自己算算样例)那就跳下一个。

那我们可以知道,周围的牛感染了,如果当前牛还未感染,那距离就一定大于 \(R\),所以我们就可以算出最小的安全距离了,再然后就是愉快地贪心了。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1005;
struct node{
	ll x;
	bool s;
	void read(){
		cin >>x>>s;
	}
}a[N];
ll n,minn=INT_MAX,cnt;
bool cmp(node xx,node yy){ return xx.x<yy.x;}  //排序点的位置 
int main()
{
	cin >>n;
	for (ll i=1;i<=n;i++) a[i].read();
	sort(a+1,a+n+1,cmp);
	
	// 找最大安全距离 
	for (ll i=1;i<=n;i++){
		if (!a[i].s){ 
			if (a[i-1].s) minn=min(minn,a[i].x-a[i-1].x);  // 若前一头牛感染,当前牛没感染,R必定小于两头牛的距离 
			if (a[i+1].s) minn=min(minn,a[i+1].x-a[i].x);  // 若后一头牛感染,当前牛没感染,R必定小于两头牛的距离 
		}
	}
	for (ll i=1;i<=n;i++){
		if (a[i].s){
			// 前一头牛没感染,当前牛感染则当前牛可感染
			// 和前一头牛距离大于最大安全距离则当前牛可感染
			if (!a[i-1].s || a[i].x-a[i-1].x>=minn) cnt++; 
		} 
	}
	cout <<cnt;;;;;;;;;
	return 0;
} 
,
posted @ 2026-03-20 19:33  CJRcn  阅读(13)  评论(1)    收藏  举报