三连击(升级版)
题目描述
将 \(1, 2,\ldots, 9\) 共 \(9\) 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 \(A:B:C\),试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
//感谢黄小U饮品完善题意
输入格式
三个数,\(A,B,C\)。
输出格式
若干行,每行 \(3\) 个数字。按照每行第一个数字升序排列。
样例 #1
样例输入 #1
1 2 3
样例输出 #1
192 384 576
219 438 657
273 546 819
327 654 981
提示
保证 \(A<B<C\)。
\(\text{upd 2022.8.3}\):新增加二组 Hack 数据。
2.题解
2.1 set集合去重 + 字符化处理
思路
这里采用三重循环枚举第一个数,后面的两个数根据比例即可算出
最重要的是如何检验后面算出的两个数和第一个数这三个数没有重复的数字!!!
代码
#include<bits/stdc++.h>
using namespace std;
bool hasDuplicateDigits(int num1, int num2, int num3){
set<char> charSet;
string combined = to_string(num1) + to_string(num2) + to_string(num3);
for (char ch : combined) {
charSet.insert(ch);
}
return charSet.size() == combined.length() && charSet.find('0') == charSet.end(); // 防止其中混入 0
}
int main(){
int A, B, C, count = 0;
cin >> A >> B >> C;
// 任何一个为 0 时,均不可能存在
if (A == 0 || B == 0 || C == 0) {
cout << "No!!!";
return 0;
}
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= 9; j++){
for(int k = 1; k <= 9; k++){
if(i != j && j != k){
int fn = i * 100 + j * 10 + k;
int sn = fn * B / A;
int tn = fn * C / A;
if(hasDuplicateDigits(fn, sn, tn)){
count++;
cout << fn << ' ' << sn << ' ' << tn << endl;
}
}
}
}
}
if(count == 0) cout << "No!!!";
}
标签:连击,string,int,charSet,样例,combined,P1618,升级版
From: https://www.cnblogs.com/trmbh12/p/18016672