不难,主要是题目好怪,感觉描述不太清楚……只拿了17分:
注 :复杂度要低于 O(n2)
一条水平的马路上种了n棵树,过了几年树都长得很高大了,由于有的树过于高大,挡住了其他的树,使得另一些树得不到阳光。如果有两棵树i、j,i顶端与j底端连线的倾角大于45度,我们就定义为i挡住了j。现在望将一些树砍低,使得不存在挡住的情况。他想知道总共最少需要砍掉多少长度,请你来帮他计算一下。
输入
第一行一个正整数 n,表示有 n 棵树。 接下来n行,每行两个正整数 pi,hi,表示一棵树的位置和高度。
输出
输出一个数,表示最少砍断多少长度。
样例输入
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;
}