poj3069(贪心)

来源:互联网 发布:proteus isis仿真软件 编辑:程序博客网 时间:2024/05/19 04:02

题目

题意:有n个点,给你一个R,要标记一些点,要求标记的点左右R距离内必须有被标记的点,且标记点数最小。求有多少点被标记。
题解:较为简单的贪心,直接枚举最左端点寻找R距离内的中心作为标记点然后再去找右端点,扫一遍就好了。
(小白上的题目,我的代码和小白代码都贴上。)
我的代码

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a[1005],vis[1005];int main(){    int r,n;    while (~scanf("%d %d",&r,&n))    {        if(r == n && r == -1)        {            break;        }        memset(vis,0,sizeof vis);        memset(a,0,sizeof a);        for (int i = 0; i < n; i++)        {            scanf("%d",&a[i]);        }        a[n] = 3000;        n++;        sort(a,a+n);        int flag = 0,left,right,ans = 0;        for (int i = 0; i < n; i++)        {            if(vis[i] == 0 && flag == 0)            {                left = a[i];                flag = 1;            }            if(left + r >= a[i] &&left + r < a[i + 1])            {                vis[i] = 1;                flag = 2;            }            if(flag == 2 && vis[i])            {                right = a[i];            }            if(a[i] - r <= right && a[i+1] - r > right)            {                flag = 0;            }        }        for (int i = 0 ; i < n; i++)        {            if(vis[i])                ans++;        }        printf("%d\n",ans);    }}

小白代码:

#include<bits/stdc++.h>using namespace std;const int MAX_N = 1005;int N,R;int X[MAX_N];void solve(){    int i = 0,ans = 0;    while (i < N){        // s是没有被覆盖的最左的点的位置        int s = X[i++];        //一直向右前进知道距s的距离大于R的点        while (i < N && X[i] <= s + R) i++;        //p是先加上标记的点的位置        int p = X[i - 1];        //一直向右前进直到距p的距离大于R的点        while (i < N && X[i] <= p + R) i++;        ans++;    }    printf("%d\n",ans);}
原创粉丝点击