再次求助(橙题左右)
  • 板块学术版
  • 楼主__er
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/7/13 15:51
  • 上次更新2023/10/27 20:38:12
查看原帖
再次求助(橙题左右)
713955
__er楼主2022/7/13 15:51

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

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

输入

第一行一个正整数 nn,表示有 nn 棵树。 接下来 nn 行,每行两个正整数 pi p_{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 - 1; i++) {
		if (a[i + 1].p - a[i].p  < a[i].h||) {
			ans += a[i].h ;
			ans -= a[i + 1].h;
		}
	}
	cout << ans;
	return 0;
}

感觉没这么简单啊……17分是暴力分吧……

2022/7/13 15:51
加载中...