原题链接

  • Online Judge: 10382 - Watering Grass
  • Virtual Judge: Watering Grass - UVA 10382
  • 洛谷:UVA10382 Watering Grass
  • LibreOJ:#10002. 「一本通 1.1 例 3」喷水装置,题目稍有不同,数据组数确定为 TTT。

解决题目

先通过勾股定理求出每个圆向左向右实际能覆盖的距离 kkk,将题目中的圆转化为矩形。

可以看出来这是一道贪心问题。我这里使用的方法是从右往左覆盖草坪,并用 lastlastlast 标记当前覆盖到的位置。

每次循环中从左向右枚举右侧(ededed)能到达当前位置 lastlastlast 的圆圈。标记出现的第一个符合要求的圆圈,lastlastlast 跳到该圆圈的左侧(ststst)。因为这些圆圈已经按照左侧(ststst)由大到小的顺序排序,因此枚举出来的一定是符合要求的最靠左侧的圆圈,覆盖草坪的速度最快,且不用考虑对之后选择的影响,因此一定最优。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;const int N = 10000;struct node {double st;double ed;bool operator < (const node &K) const {return st < K.st;//排序时 st 小的在前}
}a[N + 5];int n, cnt, l, w;
double ww;int main() {while (~scanf("%d%d%d", &n, &l, &w)) {ww = double(w) / 2;cnt = 0;for (int i = 1; i <= n; i++) {double x, y, k;scanf("%lf%lf", &x, &y);if (y <= ww) {//如果连宽度也不能覆盖则跳过continue;}cnt++;k = sqrt(y * y - ww * ww);//计算向左向右实际覆盖距离a[cnt].st = x - k;a[cnt].ed = x + k;}n = cnt;sort(a + 1, a + n + 1);double last = l;int lastp = n + 1;int ans = 0;bool flag;while (last > 0) {flag = false;for (int i = 1; i < lastp; i++) {//只循环到上一次符合要求的圆圈所在位置if (a[i].ed >= last && a[i].st < last) {flag = true;last = a[i].st;lastp = i;ans++;break;}}if (!flag) {//没有找到符合要求的圆圈,无法完成浇灌printf("-1\n");break;}}if (flag) {printf("%d\n", ans);}}return 0;
}

注意事项

  1. 题目是多组数据,组数不指定。我这里使用 while (~scanf("%d%d%d", &n, &l, &w)),当读到文件结尾时终止循环;
  2. 第 28 行,如果连宽度都不能覆盖则跳过;我刚开始时没有跳过,导致之后循环时加上了这些圆圈。会导致除样例外全错;
  3. 第 46 行我用了一个 lastplastplastp 变量,目的是让循环时只循环到上一次符合要求的圆圈,减少无法复制时的循环次数;
  4. 题目是多组数据,因此 cntcntcnt 等变量需要初始化,避免影响这次循环。
  5. LibreOJ 或一本通中的题目稍有不同,数据组数确定为 TTT。每次循环减去一并判断即可:
int T;
scanf("%d", &T);
while (T--) {...
}

UVA10382 - Watering Grass 题解相关推荐

  1. UVa-10382 Watering Grass **

    /* * Uva-10382-Watering Grass.cpp * 特别注意精度..(感觉这道题的判题有问题,开始怎么交都WA,,过两天什么都没改,再交就AC了 , 汗.. * * 详细代码注释: ...

  2. UVA-10382 Watering Grass

    题意:有一个长方形草坪,长为l,宽为w,在它的水平中心线上可以安装n个喷水器来为草坪浇水,每个喷水器能够灌溉的范围是以该喷水器为中心的半径为r的圆.我们要灌溉整个草坪,问你最少需要的喷水器数. 题解: ...

  3. UVa10382 - Watering Grass(贪心算法)

    问题:给出一个长为l,宽为w的绿化带,n个喷水装置及其对就位置x和影响半径r.问最少需要多少个喷水装置能全覆盖此绿化带 思路:首先要计算喷水装置可以覆盖的区间,如果喷水装置的影响半径小于等于w/2,是 ...

  4. uva10382 - Watering Grass

    题目大意:输入n,l,w.分别代表有n个喷水装置,草地长为L,宽为W:接下来n行,每行两个数,a,r,分别代表喷水装置在草地中的横坐标,和喷水半径.喷水装置的纵坐标都是草地的正中央.求用最少的喷水装置 ...

  5. UVa 10382 - Watering Grass

    链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&pa ...

  6. Watering Grass——UVA10382

    题目 n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each s ...

  7. *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)

    题干: 题目大意: 有一块草坪,长为l,宽为w,在它的水平中心线上有n个位置可以安装喷水装置,各个位置上的喷水装置的覆盖范围为以它们自己的半径ri为圆.求出最少需要的喷水装置个数,如果无论如何都不能覆 ...

  8. Watering Grass UUV 1038 贪心

    问题: n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each ...

  9. Watering Grass UVA - 10382 贪心

    问题 https://vjudge.net/problem/UVA-10382 分析 将一个点的覆盖范围看作是一个长方形,舍弃弓形区域,变成区间覆盖问题,用贪心法 注意:bb-ww/4有可能小于0,要 ...

最新文章

  1. 极光大数据:00后王者大军来袭 荣耀手机偏偏独得恩宠
  2. python 常见函数_Python基础函数:初学者常用的十个Python函数,非常全面!
  3. 【Tools】Wireshark3.0安装教程详解
  4. vmware centos7 扩展容量
  5. oracle idl_ub1$,system表空间急剧增大原因分析
  6. linux tar 使用
  7. VS2010 字体和背景设置
  8. python 面试题2
  9. 周鸿祎:不得不说的话
  10. ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?
  11. Linux VIM编辑器详解
  12. MySQL数据库:参数优化
  13. android仿黑客帝国字符雨
  14. 快速pow算法c语言_c语言pow(c语言中用pow算法求)
  15. 博弈论——4.1三人博弈的纳什均衡练习题
  16. 六一儿童节带娃旅游,在曼谷玩哪些景点超好玩?
  17. 基于asp.net综合管理系统源码,三层架构
  18. 用c语言绘制五角星图形,用c语言画出一个五角星图案
  19. PTA:修理牧场(哈夫曼算法)
  20. 总结常见的违背Rest原则的接口设计做法

热门文章

  1. iOS系统访问权限大全
  2. linux下获取微秒级精度的时间
  3. 如何实现3D网页游戏?
  4. 正规军入场!HashKey Capital区块链基金正式推出
  5. 加拿大曼尼托巴大学计算机专业几年,2020年加拿大曼尼托巴大学毕业时间是几月...
  6. macOS如何给idea安装ja-netfilter插件
  7. Alpha测试和Beta测试简介
  8. CF 472D Riverside Curio
  9. SwitchyOmega
  10. linux 修改系统时间和日期,Linux 修改系统日期和时间