求助站外题
  • 板块灌水区
  • 楼主__er
  • 当前回复38
  • 已保存回复38
  • 发布时间2022/7/13 15:02
  • 上次更新2023/10/27 20:39:15
查看原帖
求助站外题
713955
__er楼主2022/7/13 15:02

不难,主要是题目好怪,感觉描述不太清楚……只拿了17分:
注 :复杂度要低于 O(n2) \mathcal{O}(n^{2})

一条水平的马路上种了n棵树,过了几年树都长得很高大了,由于有的树过于高大,挡住了其他的树,使得另一些树得不到阳光。如果有两棵树i、j,i顶端与j底端连线的倾角大于45度,我们就定义为i挡住了j。现在望将一些树砍低,使得不存在挡住的情况。他想知道总共最少需要砍掉多少长度,请你来帮他计算一下。

输入

第一行一个正整数 nn,表示有 nn 棵树。 接下来n行,每行两个正整数 pip_{i},hih_{i},表示一棵树的位置和高度。

输出

输出一个数,表示最少砍断多少长度。

样例输入

3
0 2
1 2
3 3

样例输出

3

我代码:

#include <bits/stdc++.h>
#define JS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
struct tree {
	double p, h;
} a[1001];
bool cmp(tree a, tree b) {
	return a.p < b.p;
}
int n, i, ans;
int main() {
	JS;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> a[i].p >> a[i].h;
	}
	sort(a, a + n, cmp);
	for (i = 0; i < n; i++) {
		if (abs(a[i + 1].p - a[i].p ) > abs(a[i].h - a[i + 1].h)) {
			ans += abs(a[i].h - a[i + 1].h);
			ans++;
		}
	}
	cout << ans;
	return 0;
}
2022/7/13 15:02
加载中...