uva--10382Watering Grass+贪心

题意:

一片长为L宽为W的矩形草坪,然后给出n个喷头的圆心坐标和半径,问你最少需要几个喷头可以覆盖整个草坪。

思路:

刚开始的时候直接觉得可以算出每个喷头可以覆盖的区间,然后就变成前面刚做过的区间覆盖问题了;后面看了一下样例,发现这样想是不对的,因为喷头边沿的圆弧可能是不能完全覆盖住草地的,所以那些地方就必须还要别的喷头去覆盖,这样就不能直接用区间合并来做了。后面又想了一下,其实每个喷头覆盖的有效区域就是一个矩形,我们只需要求出每个喷头覆盖的有效区域(就是矩形完全包含在圆内的部分,用简单的几何知识算一下就可以得到的),就又变成区间覆盖问题了!有一点需要注意:如果一个喷头的半径不大于矩形宽度一半的话,那么这个喷头可以覆盖的有效区域为0(相当于这个矩形的内接圆),我们可以忽略这些喷头。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

typedef struct
{
       double x,y;
}P;
P p[11000];

int cmp(P p1,P p2)
{
       return p1.x<p2.x;
}

int main()
{
       int i,j,k,n;
       double len,w;
       while(scanf("%d%lf%lf",&n,&len,&w)!=EOF)
       {
                k=0;
                for(i=0;i<n;i++)
                {
                      double x1,r;
                      scanf("%lf%lf",&x1,&r);
                      if(r<=w/2)
                             continue;
                      p[k].x=x1-sqrt(r*r-w*w/4);
                      p[k].y=x1+sqrt(r*r-w*w/4);
                      k++;
                }
                sort(p,p+k,cmp);
                int cnt=0,flag=0;
                double left=0;
                for(i=0;i<k;)
                {
                      double max1=0;
                      while(p[i].x<=left&&i<k)
                      {
                              if(p[i].y>max1)
                                  max1=p[i].y;
                              i++;
                      }
                      if(max1==0)
                          break;
                      cnt++;
                      left=max1;
                      if(left>=len)
                     {
                            flag=1;
                            break;
                     }
                }
                if(flag)
                     printf("%d\n",cnt);
                else
                     printf("-1\n");
       }
   return 0;
}
时间: 2024-10-27 19:04:59

uva--10382Watering Grass+贪心的相关文章

uva 1511 - Soju(贪心)

题目链接:uva 1511 - Soju 题目大意:给出两个点集,问说分别从两个点集中取一点的哈夫曼距离最小值.注意一个点集的x坐标小于0,另一个大于0. 解题思路:因为x2一定大于x1,所以对于x这一维,一定是+x2-x1,所以只需要考虑y这一维坐标即可. #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> u

UVa 1617 Laptop (贪心)

题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左端点排,然后再扫一遍,如果第一个区间的右端点和第二个右端点一样, 一定可以相邻,如果不相等,再看是不是与左端点大小关系,如果小于左端点,那么就一定会产生空隙,如果不是小于,就可以,那么端点要向右移动一个单位,其他的也样判断. 代码如下: #include <cstdio> #include <

UVA - 10037 Bridge 贪心

题目大意:有n个人要过桥,每次只能过去两个,且这两个人中至少有一个人要带手电筒,但手电筒只有一个. 每个人都有一个过桥时间,两个人的过桥时间取决于时间长的那个. 问所有人都过桥需要多少时间,怎么过桥 解题思路:贪心,因为所有人都要过桥,且手电筒只有一个,所以要过桥时间短的人把手电筒拿回来. 有两种过桥方式使过桥时间达到最短,假设t1,t2(t1 <= t2)是当前过桥时间最短的两个人,tm,tn是过桥时间最长的两个人,且(tm <= tn) 第一种过桥方式:(不考虑最后一次t1和t2一起过桥)

UVa 11039 (排序+贪心) Building designing

白书上的例题比较难,认真理解样例代码有助于提高自己 后面的练习题相对简单,独立思考解决问题,增强信心 题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增. 解法:先按绝对值从小到大排序,然后第一个数先入队,然后依次比较后面的数,如果和队尾的数符号相反则入队,直到所有的数遍历完为止 这里用了异或运算,因为这里面没有0,所谓符号相同的两个数异或值为正,不同符号的数异或值为负 1 //#define LOCAL 2 #include <algorithm> 3

uva 1442:Cave(贪心)

题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>

UVA - 1612 Guess 贪心

题目大意:有n个选手参加比赛,题目共有三道,现在给出n个选手每道题的得分和最后的排名,(每道题的得分依据最后检查是否通过来给分,如果没通过得0分,通过得到相应分),问最后一名选手能得到的最高分是多少.(得分相同,ID小的排前面) 解体思路:要最高分,那第一名肯定要三道题都对.维护一个最高分和上一个人的ID号 接着判断一下下一名的得分,如果有得分相同的情况下,就判断一下ID号 如果当前这个人的ID号比较大,就只需要更新ID就可以了 如果没有得分相同的或者得分相同ID号比上一个人小,就找得分最大的且

Watering Grass (贪心,最小覆盖)

参考: https://blog.csdn.net/shuangde800/article/details/7828675 https://www.cnblogs.com/haoabcd2010/p/6171794.html?utm_source=itdadao&utm_medium=referral 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <cm

贪心专题(不定期更新)

1.UVa 10382 - Watering Grass (贪心-区间覆盖) 题意:一块矩形草坪,给出若干个分布在中轴线上的喷水装置,喷水范围为圆形.问能否覆盖整个草坪,若能,求出最少的喷水装置数目. 思路:圆形半径小于等于草坪宽度一半的不用考虑:在剩下的喷水圆形区域中,求出对应覆盖草坪的矩形区块,之后则进行贪心处理:找出矩形区块[L,R]左侧L小于等于当前已覆盖区域的右侧POS的区块中,右侧R最大的那个,同时更新POS. 1 #include<iostream> 2 #include<

大白书

UVA 11292 (简单贪心) 题意: n条恶龙,m个勇士,用勇士来杀恶龙.一个勇士只能杀一个恶龙.而且勇士只能杀直径不超过自己能力值的恶龙.每个勇士需要支付能力值一样的金币.问杀掉所有恶龙需要的最少金币. 思路: 贪心,均从小到大排序.为每一条龙找一个恰好能杀他的骑士.简单贪心. UVA 11729 (经典贪心问题) 题意: n个任务,需要交代B分钟,执行J分钟,让你合理选择交代任务的次序,求得n个任务完成的最小总时长. 思路: 经典贪心,通过比较俩俩的关系,得到整个序列的贪心排序方法.这个