查找最少标记点 (贪心)
输入:
N=6
R=10
X={1,7,15,20,30,50}
输出:
3
可从最左边的点开始,距离为R以内的最远的点.因为最左的区域没有覆盖的意义,所以应该尽可能覆盖靠右的点.不断重复此过程.
1 int N,R; 2 int X[MAX]; 3 4 void solve() 5 { 6 sort(X,X+N); 7 8 int i=0,ans=0; 9 while(i<N){ 10 //s是没有覆盖的最左的点的位置 11 int s=X[i++]; 12 while(i<N && X[i]<=s+R) i++; 13 //一直向右前进知道距s的距离大于R的点,p是新加上标记的点的位置 14 int p=X[i--]; 15 while(i<N && X[i]<=p+R) i++; 16 //一直向右前进直到距p的距离大于R的点 17 ans++; 18 } 19 printf("%d\n",ans); 20 }
<<挑战程序设计竞赛>>读后感