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;
}
,

浙公网安备 33010602011771号