题意:
有一条沿x轴正方向,长为L的高速公路,n个村庄,要求修建最少的公路出口数目,使得每个村庄到出口的距离不大于D。
分析:
每个村子可建出口的距离是(l-d,r+d)。将所有区间按右端点排序,若需要选择,每次都选区间右端点。
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;double l,d;int n;struct node{ double l,r;}v[100010];bool cmp(node a,node b){ if(a.r==b.r) return a.l<b.l; else return a.r<b.r;}int main(){ double x,y; while(scanf("%lf",&l)!=EOF) { scanf("%lf%d",&d,&n); int i,j; for(i=0;i<n;i++) { scanf("%lf%lf",&x,&y); int len=sqrt(d*d-y*y); v[i].l=max(x-len,0.0); v[i].r=min(l,x+len); } sort(v,v+n,cmp); int ans=1; double r=v[0].r; for(i=1;i<n;i++) { if(r>=v[i].l&&r<=v[i].r) continue; else { ans++; r=v[i].r; } } printf("%d\n",ans); }}
时间: 2024-10-12 18:57:34