要求使用桶的算法思想,用c++来写有 4 种卡片 1,6,8,9 ,每种卡片分别有 a,b,c,d 张,要求把这些卡片全部用上组合成一个十进制整数(卡片可以翻转,即 6 和 9 可以互换),使其被 7 整除。若有多种组合方式,输出任意一种即可,无解则输出 −1 。 输入数据 第一行包括四个正整数 a,b,c,d (1≤a,b,c,d≤20000) ,分别代表 1,6,8,9 卡片的个数。 输出数据 输出一个数字——组合的结果。对全部测试数据,1≤a,b,c,d≤20000 。
时间: 2023-08-16 13:08:34 浏览: 67
桶排序算法的c++实现
5星 · 资源好评率100%
这道题可以使用桶的算法思想。我们可以枚举使用的每个数字,然后将四种卡片数量按照卡片的值放到对应的桶里面,然后模拟组合的过程,找到一个能被 7 整除的组合即可。
具体的实现如下:
```c++
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 输入四种卡片的数量
int a, b, c, d;
cin >> a >> b >> c >> d;
// 将卡片数量按照卡片的值放到对应的桶里面
int bucket[10] = {0};
bucket[1] = a;
bucket[6] = b;
bucket[8] = c;
bucket[9] = d;
// 枚举使用的每个数字
for (int i = 0; i <= 9; i++) {
// 模拟组合的过程
int sum = 0;
int temp_bucket[10];
memcpy(temp_bucket, bucket, sizeof(bucket));
temp_bucket[i]--;
if (temp_bucket[i] < 0) {
continue;
}
sum += i;
// 6 和 9 可以互换,需要特殊处理
if (i == 6 || i == 9) {
temp_bucket[6]--;
temp_bucket[9]--;
if (temp_bucket[6] < 0 || temp_bucket[9] < 0) {
continue;
}
sum += 9;
}
// 组合剩下的数字
for (int j = 1; j <= 9; j++) {
int count = temp_bucket[j];
if (count < 0) {
break;
}
for (int k = 0; k < count; k++) {
sum = sum * 10 + j;
sum %= 7;
}
}
// 找到一个能被 7 整除的组合即可
if (sum == 0) {
cout << i;
for (int j = 1; j <= 9; j++) {
int count = bucket[j] - (i == j ? 1 : 0);
for (int k = 0; k < count; k++) {
cout << j;
}
}
if (i == 6 || i == 9) {
cout << 6;
}
cout << endl;
return 0;
}
}
// 无解
cout << -1 << endl;
return 0;
}
```
需要注意的是,我们在枚举使用的每个数字的时候,需要特殊处理 6 和 9 可以互换的情况,同时在组合剩下的数字的过程中,需要对每个数字进行循环模拟。最后如果找到了一个能被 7 整除的组合,就输出它并返回,如果枚举完所有的数字都没有找到,就输出 -1。
阅读全文