栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【ybtoj 贪心】B. 3.砍树问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【ybtoj 贪心】B. 3.砍树问题

B. 3.砍树问题
  • 题面
  • 解题思路
  • Code

ybtoj 贪心 B. 3.砍树问题


题面



解题思路

小小的勾股一下, 可以发现,a 不遮挡 b,a到b的距离必须 ≥ a的高度
因为树之间的距离是固定的,所以a的允许高度是固定的

注意这里的遮挡并不是只有邻近的两棵树之间会遮挡,而是任意两棵树都是有可能遮挡的
所以决定 a 的高度,就必须找到一颗离 a 最近的树,使a到b的距离最小,这样a的高度才oK

按位置将树从左到右排一下,那么只有邻近两个树,才可能是离 a 最近的树,然后两个距离比较一下就好了


Code
#include 

using namespace std;

struct DT{
	int pos, high;
}a[100100];
int n, h;

bool cmp(const DT&k, const DT&l) {
	return k.pos < l.pos;
}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++)
		scanf("%d %d", &a[i].pos, &a[i].high);
	sort(a + 1, a + 1 + n, cmp);
	
	h += max(0, a[1].high - (a[2].pos - a[1].pos));  //首尾特别处理
	h += max(0, a[n].high - (a[n].pos - a[n - 1].pos));
	
	for(int i = 2; i < n; i ++) 
		h += max(0, a[i].high - min(a[i].pos - a[i - 1].pos, a[i + 1].pos - a[i].pos));
	printf("%d", h);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604935.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号