题目描述
在未来的空中都市中,有很多个小岛(城区)。现在要求在这些小岛之间架一座桥梁,每座桥是指在两个岛之间的通道。
有个约定,如果A与B之间有桥,B与C之间有桥,则 A 与 C 之间就不能再架桥了,即对于城市中的任意三个岛,不能在其中的两两之间都架上桥。在这样的约定下,要求架的桥的数量最多。当然不必考虑具体的空间结构问题。
输入格式
输入文件只包含一行,其中仅包含一个非负整数(0≤1000)n(0≤n≤1000),表示小岛的数量。
输出格式
输出文件也只包含一行,即表示最多能架设的桥梁数量。
-
- 数学模型构建
- 这个问题可以转化为图论中的一个问题。我们要在个顶点(代表小岛)之间构建边(代表桥),同时满足对于任意三个顶点,不能两两之间都有边相连的条件,求边数的最大值。
- 当时,显然桥的数量为。当时,桥的数量为。当时,根据条件只能有条边(比如连接顶点和,顶点和,但不能连接顶点和)。
- 寻找规律
- 我们发现当较大时,为了满足条件且使桥的数量最多,我们可以将这些小岛分成两组,使得同一组内的小岛之间不架桥,只在两组之间架桥。假设将个小岛分成两组,一组有个小岛,另一组有个小岛。
- 那么桥的数量就是。我们需要找到使得最大。对于二次函数,其对称轴为(当为偶数时)或者与(当为奇数时)时取得最大值。
二、C++ 代码实现
#include <iostream> using namespace std; int main() { int n; cin >> n; if (n <= 2) { cout << n - 1 << endl; } else { cout << (n / 2)*(n - n / 2) << endl; } return 0; }
- 数学模型构建
-
- 代码解释
- 首先我们读入小岛的数量。
- 如果,当时桥数为,当时桥数为,所以直接输出。
- 当时,我们按照上述分析,计算(为偶数)或者(为奇数)时的值并输出。
三、算法复杂度分析
- 时间复杂度
- 程序中只进行了简单的读入、判断和计算操作,时间复杂度为,因为不管输入的是多少,计算步骤都是固定的,不随的增大而增加计算步骤。
- 空间复杂度
- 程序中只使用了几个固定大小的变量(和一些临时变量用于计算),空间复杂度为。
- 代码解释