集训第四周(高效算法设计)E题 (区间覆盖问题)

UVA10382 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21419

只能说这道题和D题是一模一样的,不过要进行转化,这道题有一道坑,方法一需要使用scanf()输入,还需判断输入的正确性,即scanf()==3。。。。。

 

方法一:

#include"iostream"
#include"cstdio"
#include"algorithm"
#include"cmath"
using namespace std;

const int maxn=100000+10;
double l,w;

struct node
{
    double x,y;
}a[maxn],b[maxn];

bool cmp(node a1,node a2)
{
    return a1.x<a2.x;
}

bool cm(node a1,node a2)
{
    return a1.y>a2.y;
}

int Init(int num)
{
double wei,r;
int c=0;
double v;
for(int i=0;i<num;i++)
{
    cin>>wei>>r;
    if(2*r<w) continue;
    v=sqrt((r*r)-(w*w)/4);
    a[c].x=wei-v;
    a[c].y=wei+v;
    //cout<<a[c].x<<"  "<<a[c].y<<endl<<endl;
    c++;
}
return c;
}

int main()
{
    int f,n;
    while(scanf("%d%lf%lf",&n,&l,&w)==3)
    {
      f=Init(n);
      double M=l;

     sort(a,a+f,cmp);

    if(a[0].x>0||f==0) cout<<-1<<endl;
    else
    {
     sort(a,a+f,cm);
     int ff=0,flag=0,sum=0,j=0,i;
     double begi,right=-100,big;
     begi=0;
     while(begi<M)
     {
            for(int i=0;i<f;i++)
            {
                if(a[i].x>begi) continue;
                if(a[i].y<=begi) continue;
                begi=a[i].y;sum++;flag=1;break;
            }
            if(flag) flag=0;
            else
            {
                ff=1;
                break;
            }
     }
    if(ff) cout<<-1<<endl;
    else {
            cout<<sum<<endl;
         }
     }
    }

    return 0;
}

方法二:
#include"iostream"
#include"cstdio"
#include"algorithm"
#include"cmath"
using namespace std;

const int maxn=100000+10;
double l,w;

struct node
{
    double x,y;
}a[maxn],b[maxn];

bool cmp(node a1,node a2)
{
    return a1.x<a2.x;
}

bool cm(node a1,node a2)
{
    return a1.y>a2.y;
}

int Init(int num)
{
double wei,r;
int c=0;
double v;
for(int i=0;i<num;i++)
{
    cin>>wei>>r;
    if(2*r<w) continue;
    v=sqrt((r*r)-(w*w)/4);
    a[c].x=wei-v;
    a[c].y=wei+v;
    //cout<<a[c].x<<"  "<<a[c].y<<endl<<endl;
    c++;
}
return c;
}

int main()
{
    int f,n;
    while(cin>>n>>l>>w)
    {
      f=Init(n);
      double M,x,a1,b1;
      M=l;

     sort(a,a+f,cmp);

     if(a[0].x>0||f==0) cout<<-1<<endl;

      else
      {
     sort(a,a+f,cmp);
     int cnt=0;
        double left=0, right=0;
        bool flag=false;

        if(a[0].x <= 0 ){
            int i=0;

            while(i < f){

                int j=i;
                while(j<f && left>=a[j].x){
                    if(a[j].y > right)
                        right=a[j].y;
                    ++j;
                }
                if(j==i) break;

                ++cnt;
                left=right;
                i=j;

                if(left>=l){
                    flag=true;
                    break;
                }
            }
        }
        if(flag) printf("%d\n", cnt);
        else printf("-1\n");
    }
    }
    return 0;
}

 

posted @ 2015-08-05 15:47  江南何采莲  阅读(216)  评论(0编辑  收藏  举报