小YY在学习树论时,看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称为“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。
什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设 key[p] 表示结点 p 上的数值。对于其中的每个结点 p ,若其存在左孩子 lc ,则 key[p] > key[lc] ;若其存在右孩子 rc ,则 key[p] < key[rc] 。注意,本题中的二叉搜索树应满足对于所有结点,其左子树中的 key 小于当前结点的 key ,其右子树中的 key 大于当前结点的 key 。
小YY与他人讨论的内容则是,现在给定一棵二叉树,可以任意修改结点的数值。修改一个结点的数值算作一次修改,且这个结点不能再被修改。若要将其变成一棵二叉搜索树,且任意时刻结点的数值必须是整数(可以是负整数或0),所需的最少修改次数。
相信这一定难不倒你!请帮助小YY解决这个问题吧。
从文件 binary.in 中读入数据。
输出到文件 binary.out 中。
3
2 2 2
1 0
1 1
2
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
int n, r, g;
long long a[MAXN];
bool check() {
//不会写了
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> r >> g;
for (int i = 1; i <= n; i++) cin >> a[i];
long long l = 1, r ;
while (l <=r) {
long long mid = (l + r) / 2;
if (check(mid)) {
r = mid;
} else {
l = mid + 1;
}
}
cout << l << endl;
return 0;
}