• 集训第四周(高效算法设计)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
    ", cnt);
            else printf("-1
    ");
        }
        }
        return 0;
    }
    

     

  • 相关阅读:
    《梦断代码》随笔第1篇
    四则运算3
    1、软件工程结对开发之求一维数组中连续最大子数组之和
    四则运算2单元测试
    《梦断代码》随笔第0篇
    四则运算2完整版
    四则运算2设计思想
    软件工程第一个程序
    软件工程阅读计划
    电梯调度之需求分析
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4704896.html
Copyright © 2020-2023  润新知