具体代码用c++语言实现总时间限制:1000ms内存限制:65536kB 描述 对于一个元素为数字1-9的集合A (每个数字的数量不超过4个,集合中元素的数量不 超过14个),判断其是否满足如下规则: 集合A可以分割为若干个由3个数字组成的集合Bo..Bn和一个由2个数字组成的集合 C。其中Bo..Bn需要满足每个集合中的数字均相等或者依次递增一(例如555以及456 均满足条件):C中的两个数字相等 显然,当集合中的元素个数等于3n+2(n=0,1..4)时才有可能满足上述条件,我们 将元素个数不为3n+2的集合称为“相公的集合,满足上述条件的集合称为能够“胡”的集 合,否则则是“不胡”的集合 输入 输入的每一行包括一组测试数据,测试数据的开头为0表示测试结束;每一组数据由 若干个1-9的数字组成,数字之间用空格隔开 输出 每一行输出对应一行输入的结果,对于“相公的集合输出“XIANGGONG ;对于满 足“胡”的集合,输出“HU”;否则输出 B∪H∪ 样例输入 12 4 4 1 11 3 4 6 7 8 9 9 9 1 1 1 2 3 4 5 6 7 8 9 9 9 9 0 样例输出 BUHU HU XIANGGONG HU
时间: 2024-03-13 07:44:10 浏览: 137
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool check(vector<int>& nums) {
int n = nums.size();
if (n % 3 != 2) {
return false;
}
sort(nums.begin(), nums.end());
for (int i = 0; i < n; ) {
int j = i + 1;
while (j < n && nums[j] == nums[i]) {
j++;
}
int k = j;
while (k < n && nums[k] == nums[j-1]+1) {
k++;
}
if (k - i < 3) {
return false;
}
i = k - 1;
}
return true;
}
bool dfs(vector<int>& nums) {
int n = nums.size();
if (n == 2) {
return true;
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
vector<int> tmp(nums);
tmp.erase(tmp.begin()+j);
tmp.erase(tmp.begin()+i);
for (int k = 0; k < n-2; k++) {
vector<int> sub(tmp.begin()+k, tmp.begin()+k+3);
if (check(sub) && dfs(tmp)) {
return true;
}
}
}
}
return false;
}
int main() {
vector<int> nums;
while (true) {
nums.clear();
int x;
while (cin >> x && x != 0) {
nums.push_back(x);
}
if (nums.empty()) {
break;
}
if (dfs(nums)) {
cout << "HU" << endl;
} else if (nums.size() % 3 != 2) {
cout << "XIANGGONG" << endl;
} else {
cout << "BUHU" << endl;
}
}
return 0;
}
```
阅读全文