问题描述
  Banff城雇用了一家广告公司来提升这座城市对潜在的游客的吸引力。其中一个计划中的口号声称延伸在这座城市周围的山脉组成了加拿大最美丽的天际线。但是加拿大消费者保护协会认为“最美丽的天际线”是一种主观的,无法证实的声称,而且可能因此让人误解。
  然后那个广告公司就想出了一个口号“Banff——加拿大最长的天际线”。虽然没有那么引人注意,但这是有希望能证实的,而且这样就能被加拿大复杂的广告法律所接受了。
  这就是你要介入的原因。广告公司需要的是一个能确定天际线的长度的程序。把每座山脉看作是一个二维的上面两条边长度相等的三角形。一条天际线是一座或多座山脉的轮廓。天际线的长度就是轮廓的总长度。下面的左图显示了三座山脉。右图显示了(用黑线)天际线和(用虚线)山脉上面的边中不是天际线的部分。注意位于山脉之间的地平线部分不在天际线考虑的范围内。
输入格式
  第一行包含一个正整数N,表示范围内的山脉数。接下来N行每行用三个整数X,H,B来描述每一座山脉,分别表示山脉的最高点到某个固定的点的水平距离,山脉的垂直高度和山脉的底边的宽度。每座山脉的底部在同一条水平线上。数据满足N≤100,H>0而且B>0。
输出格式
  输出只有一行,即天际线的长度。输出那个长度四舍五入后的结果。
样例输入
3
20 30 35
37 24 29
60 20 13
样例输出
138
数据规模和约定
  对于20%的数据,1≤N≤5
  对于50%的数据,1≤N≤30
  对于100%的数据,1≤N≤100

思路:很容易想到离散化,将三角形三个点的横坐标以及没两条斜边所在的直线的交点记录下来,然后去重,求出所有x与所有线段(不是直线)相交的最大值(纵坐标),然后求相邻两个点的距离之和即可,注意去除两个三角形相隔的部分还有不满足条件的点

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
const int maxn = 1e3 + 10;
const double eps = 1e-7;
using namespace std;  struct line {  double a, b, c;  double sx, ex;  line() {}  line(double a, double b, double c, double sx, double ex) :  a(a), b(b), c(c), sx(sx), ex(ex) {}
} lne[maxn];
double x[maxn * 100], y[maxn * 100];
int numl, numx, numy;
int n, kase = 1;  double pointx(line A, line B) {  double det1 = A.a * B.b - A.b * B.a;  double det2 = A.c * B.b - A.b * B.c;  return det2 / det1;
}  double pointy(double xx) {  double sy = -1.0;  for(int i = 0; i < numl; i++) {  if(xx < lne[i].sx - eps) continue;  if(xx > lne[i].ex + eps) continue;  sy = max(sy, (lne[i].c - lne[i].a * xx) / lne[i].b);  }  return sy;
}  int main() {  scanf("%d", &n);numl = numx = 0;  double X, H, W;  for(int i = 0; i < n; i++) {  scanf("%lf %lf %lf", &X, &H, &W);  double sx1 = X + W / 2, k;  double sx2 = X - W / 2, b;  x[numx++] = sx1; x[numx++] = sx2;  k = H / (X - sx1); b = -k * sx1;  lne[numl++] = line(k, -1, -b, X, sx1);  k = H / (X - sx2); b = -k * sx2;  lne[numl++] = line(k, -1, -b, sx2, X);  }  for(int i = 0; i < numl; i++) {  for(int j = i + 1; j < numl; j++) {  if(fabs(lne[i].a - lne[j].a) < eps && fabs(lne[i].b - lne[j].b) < eps) continue;  x[numx++] = pointx(lne[i], lne[j]);  }  }  sort(x, x + numx);  int num = unique(x, x + numx) - x;  for(int i = 0; i < num; i++) {  y[i] = pointy(x[i]);  }  double ans = 0;  for(int i = 0; i < num - 1; i++) {  if(y[i] < -eps || y[i + 1] < -eps) continue;  if(fabs(y[i]) < eps && fabs(y[i + 1] - y[i]) < eps) continue;  double dx = (x[i + 1] - x[i]) * (x[i + 1] - x[i]);  double dy = (y[i + 1] - y[i]) * (y[i + 1] - y[i]);  ans += sqrt(dx + dy);  }  printf("%.0f",ans);    return 0;
}  

算法提高 The Sky is the Limit相关推荐

  1. 北华大学计算机程序设计算法提高训练营个人赛(无L)

    北华大学计算机程序设计算法提高训练营个人赛(无L) 明明是北华大学的训练赛,结果被屠榜了hhh,L防ak题吧这也太难了 A-洛姐打题日记 题目描述 洛姐开开心心地打题,可是她看不懂评测机给的判定结果, ...

  2. 算法提高 学霸的迷宫

    算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...

  3. 算法提高 邮票面值设计

    算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...

  4. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  5. 蓝桥杯练习系统习题-算法提高2

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-算法提高2 题目搜索方式:Ctrl+F--> 输入题目名称-> ...

  6. 蓝桥杯练习系统习题-算法提高1

    文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 蓝桥杯练习系统习题-算法提高1 题目搜索方式:Ctrl+F--> 输入题目名称-> ...

  7. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  8. [蓝桥杯][算法提高VIP]夺宝奇兵-dp

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  9. 算法笔记_163:算法提高 最大乘积(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数 ...

最新文章

  1. Mysql 基本框架 select的全过程
  2. 前端学习(2568):使用高级特性provide和inject
  3. 解决Mac安装LightGBM报错LightGBM and gcc 8 in MacOS: Library not loaded
  4. python打开一个本地目录文件路径
  5. JXSE 2.5 : What's Cool #6 -- PeerGroup Executor and ScheduledExcutor
  6. Windows 系统环境变量大全
  7. OpenCV笔记(十八)——使用霍夫变换检测圆圈
  8. 当当网Python图书数据分析
  9. 尚学堂马士兵struts2 课堂笔记(四)
  10. SpringBoot集成SpringSecurity步骤
  11. 三星 android recovery,三星所有机型如何进入recovery模式的方法
  12. 第13期 《仰望星空,脚踏实地》 12月刊
  13. Error: Unresolved node modules: vue
  14. Windows超级管理器
  15. 路由器上网流程以及nat内网ip
  16. 计算机一级和二级考试内容有什么不同吗?
  17. RocketMQ可视化Web管理界面
  18. 逻辑回归的参数计算:牛顿法,梯度下降法,随机梯度下降法
  19. dapper mysql通用类_Dapper ORM 用法
  20. Teamviewer 15.0 中文版 — 远程控制软件

热门文章

  1. ESB之Mule ESB的使用
  2. jsp黄色感叹号_跳出个本地连接,带个黄色三角的叹号
  3. android适配遇到的一些问题
  4. Java线程池实现原理及其在美团业务中的实践(转载加总结)
  5. 零基础新手入门游戏建模,制作3D建模有哪些步骤流程!必备知识
  6. 计算机文字处理的基本过程,计算机基础文字处理实验报告.doc
  7. SID 2023观察:显示行业的新潮向是什么?
  8. 最新导则下生态环评报告编制要求与规范
  9. 深度学习的57个名词
  10. 基于python+vue+elementUI+django高校教室管理系统(前后端分离)#毕业设计