P1008 [NOIP1998 普及组] 三连击

题目链接 P1008 [NOIP1998 普及组] 三连击

[NOIP1998 普及组] 三连击

题目描述
\(1, 2, \ldots , 9\)\(9\) 个数分成 \(3\) 组,分别组成 \(3\) 个三位数,且使这 \(3\) 个三位数构成 \(1 : 2 : 3\) 的比例,试求出所有满足条件的 \(3\) 个三位数。

输入格式:
输出格式: 若干行,每行 \(3\) 个数字。按照每行第 \(1\) 个数字升序排列。

输入样例输出样例
192 384 576
* * *
...
* * *
剩余部分不予展示

分析
涉及知识:标记思想、全排列

对于本题,我们需要做两件事情

  1. 将数据分成三组 \(a,b,c\)
  2. 判断三组数据的比例

这样可以通过全排列解决,但是仔细想想,发现其实完全没必要。

因为答案是三个三位数,那么我直接枚举 \(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;
}
posted @ 2023-05-12 11:48  HelloHeBin  阅读(267)  评论(0)    收藏  举报