题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。
输入输出格式
输入格式:
木有输入
输出格式:
若干行,每行33个数字。按照每行第11个数字升序排列。
输入输出样例
输入样例#1:
无
输出样例#1:
192 384 576 * * * ... * * * (输出被和谐了)
使用暴力的方法,但是如果这样写
#include<bits/stdc++.h>
int a[20];
int main()
{
for(int i=123;i<1000;++i)
{
for(int j=123;i<1000;++j)
{
for(int m=123;m<1000;++m)
{
int ss=0;
memset(a,0,sizeof(a));
a[i/10]=a[i/100%10]=a[i%10]=a[j/10]=a[j/100%10]=a[j%10]=a[m/10]=a[m/100%10]=a[m%10]=1;
for(int i=1;i<=9;++i)
{
if(a[i]==1)
++ss;
}
if(ss==9&&6*i==3*j==2*m)
{
printf("%d %d %d\n",i,j,m);
}
}
}
}
return 0;
}
时间复杂度太高了,那么就要考虑怎么样去优化这个过程。
题目中的 1:2:3可以作为突破口,通过三个数呈比例,可以在计算的时候只计算一个for循环时间结果的输出。
#include<bits/stdc++.h>
using namespace std;
#define M(a) memset(a,0,sizeof(a))
int a[10];
int main()
{
for(int i=123;i<=333;++i)
{
int ss=0;
M(a);
a[i%10]=a[i/100]=a[i/10%10]=a[2*i%10]=a[2*i/100]=a[2*i/10%10]=a[3*i%10]=a[3*i/100]=a[3*i/10%10]=1;
for(int j=1;j<=9;++j)
{
ss+=a[j];
}
if(ss==9)
{
printf("%-4d%-4d%d\n",i,2*i,3*i);
}
}
return 0;
}