NOIP 1998 三连击(暴力)

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。 
例如:三个三位数192,384,576满足以上条件。 
 

输入

本题无输入。 
 

输出

输出所有符合要求的三个三位数,每一组占一行,数字之间由一个空格分隔。 
每组中的三个数字按照从小到大输出,各组之间按照每组的第一个数从小到大输出。 

分析:枚举第一个数字100枚举到1000,但是因为三个数字需要用完9个数字,第一个数字其实可以直接从123开始枚举,枚举到329就够了,减少不必要的枚举次数,剩余两个数字是这个数的2倍和3倍,然后用一个标记数组存下这3个3位数的所有数字,如果每个数字都用到了,就输出。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cctype>
#include<cstring>
#include<utility>
#include<cstdlib>
#include<iomanip>
#include<iostream>
#include<algorithm>
#define Clear(x) memset(x,0,sizeof(x))
#define fup(i,a,b) for(int i=a;i<b;i++)
#define rfup(i,a,b) for(int i=a;i<=b;i++)
#define fdn(i,a,b) for(int i=a;i>b;i--)
#define rfdn(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int maxn = 1e+7;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1.0);
const double eps = 1e-8;
int vis[15];

int read()
{
    char ch=getchar();int ret=0,f=1;
    while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
    return f*ret;
}

int main()
{
    bool flag;
    rfup(i,123,329)
    {
        flag=true;
        Clear(vis);
        vis[i%10]=vis[i/10%10]=vis[i/100]=1;
        vis[i*2%10]=vis[i*2/10%10]=vis[i*2/100]=1;
        vis[i*3%10]=vis[i*3/10%10]=vis[i*3/100]=1;
        rfup(j,1,9)
        {
             if(!vis[j]) flag=false;
        }
        if(!flag) continue;
        printf("%d %d %d\n",i,i*2,i*3);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41311604/article/details/81542656