用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∪。
时间: 2024-03-13 12:46:12 浏览: 119
以下是 C++ 代码实现:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[15];
bool check(int *a, int n)
{
sort(a, a + n); // 先排序
if (n % 3 != 2) // 不是 3n+2 个数
return false;
int c = a[n - 1] * 10 + a[n - 2]; // C 的值
for (int i = 0; i < n - 2; i += 3)
{
if (a[i] == a[i + 1] && a[i] == a[i + 2]) // 三个数相等
continue;
if (a[i] + 1 == a[i + 1] && a[i + 1] + 1 == a[i + 2]) // 三个数递增
continue;
return false; // 不符合要求
}
for (int i = 0; i < n - 2; i += 3)
{
int b = a[i] * 100 + a[i + 1] * 10 + a[i + 2]; // B 的值
if (b > c) // B 中的数比 C 大
return false;
}
return true; // 符合要求
}
int main()
{
while (true)
{
int n = 0;
while (true)
{
cin >> a[n];
if (a[n] == 0) // 输入 0 结束
return 0;
n++;
if (getchar() == '\n') // 一行输入结束
break;
}
if (check(a, n))
cout << "HU" << endl;
else if (n % 3 != 2)
cout << "XIANGGONG" << endl;
else
cout << "BUPAI" << endl;
}
return 0;
}
```
输入每一行的数字,存储在 `a` 数组中,然后调用 `check` 函数判断是否符合要求。`check` 函数中,先对 `a` 数组进行排序,然后判断是否为 3n+2 个数,计算出 C 的值。接着,对于每个 B,判断是否符合要求,如果所有的 B 都符合要求,再判断 B 是否小于等于 C。如果都符合要求,返回 `true`,否则返回 `false`。
在 `main` 函数中,一直读入输入,直到读入 0 结束。对于每一组输入,如果符合要求,输出 `HU`,如果不符合要求且不是 3n+2 个数,输出 `XIANGGONG`,否则输出 `BUPAI`。
阅读全文