P1008 [NOIP1998 普及组] 三连击
[NOIP1998 普及组] 三连击
题目描述
将 \(1, 2, \ldots , 9\) 共 \(9\) 个数分成 \(3\) 组,分别组成 \(3\) 个三位数,且使这 \(3\) 个三位数构成 \(1 : 2 : 3\) 的比例,试求出所有满足条件的 \(3\) 个三位数。
输入格式: 无
输出格式: 若干行,每行 \(3\) 个数字。按照每行第 \(1\) 个数字升序排列。
| 输入样例 | 输出样例 |
|---|---|
无 |
192 384 576 * * * ... * * * 剩余部分不予展示 |
分析
涉及知识:标记思想、全排列
对于本题,我们需要做两件事情
- 将数据分成三组 \(a,b,c\)
- 判断三组数据的比例
这样可以通过全排列解决,但是仔细想想,发现其实完全没必要。
因为答案是三个三位数,那么我直接枚举 \(a\),可直接计算 \(b=2×a, c=3×a\)。
需要做的就是判断是否由 \(1-9\) 组成,可以使用标记思想。
#include<bits/stdc++.h>
using namespace std;
int main() {
for(int i=100; i<333; i++) {
int a=i, b=2*i, c=3*i;
int vis[10]= {0}, s=0;// vis[i]=1 表示使用过 i.
vis[a/100] = vis[a/10%10] = vis[a%10] = 1;
vis[b/100] = vis[b/10%10] = vis[b%10] = 1;
vis[c/100] = vis[c/10%10] = vis[c%10] = 1;
for(int j=1; j<=9; j++) s+=vis[j];
if(s==9) {
cout<<a<<" "<<b<<" "<<c<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号