zoukankan      html  css  js  c++  java
  • 一个小贪心 区间覆盖问题

    一个小贪心,东西很简单,但毕竟是自己做的:

    喷水装置(二)

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
    描述
      有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。
    输入
      第一行输入一个正整数N表示共有n次测试数据。
      每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。
      随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。
    输出
      每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。
      如果不存在一种能够把整个草坪湿润的方案,请输出0。
    样例输入
    2 2 8 6 1 1 4 5 2 10 6 4 5 6 5
    样例输出
    1 2

    C代码如下

      1 #include "stdio.h"
      2 #include "math.h"
      3 typedef struct _Equip//区间的结构体
      4 {
      5     float L;
      6     float R;
      7 }Equip;
      8 
      9 void Q_sort(Equip **a,int low,int heigh)//对区间按开始端进行升序排序
     10 {
     11     if(low < heigh)
     12     {
     13         int i = low,j = heigh;
     14         Equip * temp;
     15         temp = a[i];
     16         while(i < j)
     17         {
     18             while(i < j && a[j]->L > temp->L)
     19             {
     20                 j --;
     21             }
     22             if(i < j)
     23             {
     24                 a[i] = a[j];
     25                 i++;
     26             }
     27             while(i < j && a[i]->L <= temp->L)
     28             {
     29                 i ++;
     30             }
     31             if(i < j)
     32             {
     33                 a[j] = a[i];
     34                 j --;
     35             }
     36         }
     37         a[i] = temp;
     38         Q_sort(a,low,i - 1);
     39         Q_sort(a,i+1,heigh);
     40     }
     41 }
     42 Equip buf[10000];
     43 Equip *Si[10000];
     44 
     45 //寻找从begin开始到end-1之间符合条件的一个区间
     46 //即开始端 <= Rc 的所有小区间中结束端最大的那个小区间 
     47 int findmaxR(int begin,int end)
     48 {
     49     int k = begain;
     50     for(int i = begain;i < end;i++)
     51     {
     52         if(Si[i]->R >= Si[k]->R)
     53         {
     54             k = i;
     55         }
     56     }
     57     return k;
     58 }
     59 int main()
     60 {
     61     int i,j,m,n,count,s;
     62     float w,h,Rc,Lc,x,r;
     63     while(scanf("%d",&m) != EOF)
     64     {
     65         for(i = 0;i < m;i++)
     66         {
     67             scanf("%d%f%f",&n,&w,&h);
     68             s = 0;
     69             for(j = 0;j < n;j++)
     70             {
     71                 scanf("%f%f",&x,&r);
     72                 if(r > h/2.0)
     73                 {
     74                     buf[j].L =x - sqrt(r * r - h * h / 4.0);
     75                     if(buf[j].L < 0.0)
     76                     {
     77                         buf[j].L = 0.0;
     78                     }
     79                     buf[j].R =x + sqrt(r * r - h * h / 4.0);
     80                     if(buf[j].R > w)
     81                     {
     82                         buf[j].R = w;
     83                     }
     84                     Si[s++] = &buf[j];
     85                 }
     86             }
     87             Q_sort(Si,0,s-1);//从这里到前边都是准备工作,后边开始贪心了
     88             Rc = 0.0;
     89             for(j = 0;j < s && Rc < w;)
     90             {
     91                 if(Si[j]->L <= Rc)
     92                 {
     93                     int k;
     94                     for(k = j;k < s;k++)
     95                     {
     96                         if(Si[k]->L > Rc)
     97                         {
     98                             break;
     99                         }
    100                     }
    101                     int maxR = findmaxR(j,k);
    102                     count ++;
    103                     Rc = Si[maxR]->R;
    104                     j = maxR +1;
    105                 }
    106                 else
    107                 {
    108                     break;
    109                 }
    110             }
    111             if(Rc < w)
    112                 printf("0\n");
    113             else
    114                 printf("%d\n",count);
    115         }
    116     }
    117 }

    作者:风波

    mail : fengbohello@qq.com

  • 相关阅读:
    求10个随机数的最大值、最小值、和、平均值
    设计并编写代码自动格斗类游戏
    用while实现阶乘
    安卓第三次作业
    第二次作业
    第一次作业
    第四次作业
    dialog
    用画图的方法理解原型对象和原型链,事半功倍今晚不加班
    【学习笔记】浅析Promise函数
  • 原文地址:https://www.cnblogs.com/fengbohello/p/2876233.html
Copyright © 2011-2022 走看看