两个元素连通的条件是差值绝对值为1,只要差值超过2,就需要另外新增连通边,先对输入排序,依次检查相邻两位。需要分情况决定新增边的个数:
- 之前的遍历所有元素值相同,此时该元素无后继结点,每一个元素都是孤立的,需要增加n-1条边连通孤立元素,1条边连通下一个元素,共增加n条边。
- 之前的遍历存在元素值不同,所有元素连通,仅需要增加1条边连通下一个元素。
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, ans = 0;
cin >> n;
vector<int> a(n);
for (auto&& i : a) {
cin >> i;
}
sort(a.begin(), a.end());
int cnt = 1; // 记录之前遍历中相同元素个数
int dif = 1; // 记录不同元素个数
for (int i = 0; i + 1 < n; i++) {
if (a[i] == a[i + 1]) {
cnt++;
} else if (a[i] + 1 == a[i + 1]) {
dif++;
} else {
ans++;
if (dif == 1) {
ans += --cnt;
}
cnt = 1;
dif = 1;
}
}
if (dif == 1) {
ans += --cnt;
}
cout << ans << endl;
}
}

京公网安备 11010502036488号