這個題目是比較經典的貪心演算法,可以對這個題目轉換一下,所有的點到公路的距離在要求的範圍之內會形成一個個線段,也就是說現在要求出最少的點
使這些點能覆蓋所有區間,也就是每個區間都有點,這樣只要按照區間的右端點排序,每次點就放在右端點就OK了,然後向後尋找左端點在剛才的點的右邊
的接著放,一直到所有村莊的線段都處理完成,這個貪心演算法也算是完成了!
#include <iostream>#include <string.h>#include <stdio.h>#include <cmath>#include <algorithm>using namespace std;struct point{ double left; double right;}po[100000];int cmp(const void *a,const void *b){ return (*(point*)a).right < (*(point*)b).right ? -1 : 1;}int main(){ double way_long,dis; int n,i,j,k; double a,b; double rec; int re; while(scanf("%lf%lf%d",&way_long,&dis,&n)!=EOF) { re=0; for(i=0;i<n;i++) { scanf("%lf%lf",&a,&b); rec=sqrt(dis*dis-b*b); po[i].left=a-rec; po[i].right=a+rec; if(po[i].left < 0) po[i].left=0; } qsort(po,n,sizeof(po[0]),cmp); // for(i=0;i<n;i++) //printf("%lf\n",po[i].right); re=0; i=0; while(i<n) { k=i; re++; while(i<n && po[i].left <= po[k].right) i++; } printf("%d\n",re); } return 0;}