您的位置:首页 > 其它

贪心专练3 最小标记数问题

2017-12-21 15:07 309 查看
题意:在一条直线上,有n个点。从这n个点中选择若干个,给他们加上标记。对于每一个点,其距离为R以内的区域里必须有一个被标记的点。问至少要有多少点被加上标记。
input:6   10    1 7 15 20 30 50
output:  3
————————————————————————————————————————————————————
思路:最优策略:在最左侧开始,往右找到最大R处接近R的地方标记,在此标记点处往右最大R处找到最大覆盖范围为一个周期。再从下一个未覆盖点开始重复该最优策略(即充分最大化R的覆盖区)
代码:
#include <stdio.h>
int X[1000];
int main()
{
int N,R;
while(scanf("%d%d",&N,&R)!=EOF)
{
int i;
for(i=0; i<N; i++)
scanf("%d",&X[i]);
int k=0;
int cnt=0;
while(k<N)
{
int s=X[k++];//S用来记录当前位置同时把光标移动到下一位置
while(k<N&&X[k]<=s+R)k++;记录标记点左侧做大覆盖区
int p=X[k-1];标记点
while(k<N&&X[k]<=p+R)k++;记录标记点右侧最大覆盖区
cnt++;
}
printf("最少标记点数为: %d\n",cnt);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: