Saruman's Army POJ3069

来源:互联网 发布:电脑连不上网络错误711 编辑:程序博客网 时间:2024/05/22 21:47

都是从小到大一次贪心

首先考虑最左边的点

1 它没有被覆盖,所以我们要选择这个点,同时它有可能覆盖后面的点.

2 如果它覆盖了后面的点,那反过来,选择被它覆盖的点至少'不亏',这种情况下,选择被覆盖的最右边的是最贪的


所以贪心的思路就是

1选择第一个没有覆盖的点

2找到被这个点覆盖的最右边的点(包括它自己)也就是说覆盖不到其他的点,就选择他自己

3重复12


最后求喷


#include <iostream>#include <cstdio>#include <cstring>#include<algorithm>#include <cmath>#define mem(x) memset(x,0,sizeof(x))using namespace std;int A[1010];int main(){    //freopen("in.txt","r",stdin);    int r,n;    while(cin>>r>>n)    {        if(r==-1&&n==-1) break;        for(int i=1;i<=n;i++)        {            cin>>A[i];        }        sort(A+1,A+n+1);        int rgt = -1,cnt=0;        for(int i=1;i<=n;i++)        {            if(A[i]<=rgt)continue;            int k = i;            while(k<=n&&A[k+1]<=A[i]+r)                k++;            i=k;            cnt++;            if(k<=n)                rgt = A[k]+r;            //cout<<"rgt="<<rgt<<endl;        }        cout<<cnt<<endl;    }    return 0;}




原创粉丝点击