P1008 三连击
Main Idea:
用1~9构造三个呈1:2:3比例的三位数,每个数用一次。
Summary:
1.对于有些可以用数学在草稿纸上简化时间复杂度和代码的问题,就先简化。
2.这题其实不用三重循环,只要让前一个数乘以2和3就可以得到后两个数了。
Problem Solving Idea:
1.先用O(n^3)解,然后得出的答案用O(1)输出。
2.O(n)得出第一个数,然后*2、*3得到后面的数。
AC代码(version 1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
// int a[11];
//
// for(int i=123;i<1000;i++){
// for(int j=100;j<1000;j++){
// for(int k=100;k<1000;k++){
// int flag=1;
// memset(a,0,sizeof(a));
// a[i/100]++;a[i%10]++;a[i/10%10]++;
// a[j/100]++;a[j%10]++;a[j/10%10]++;
// a[k/100]++;a[k%10]++;a[k/10%10]++;
// for(int v=1;v<10;v++){
// if(a[v]==1) flag=1;
// else{
// flag=0;
// break;
// }
// }
// if(flag==0) continue;
// else if(k*3==i&&k*2==j){
// printf("%d %d %d
",k,j,i);
// }
//
// }
// }
// }
printf("192 384 576
219 438 657
273 546 819
327 654 981
");
return 0;
}
AC代码(version 2)
#include<bits/stdc++.h>
int i,j,v;
int a[10];
int main()
{
for(i=192;i<=327;i++)
{
memset(a,0,sizeof(a));
v=0;
a[i%10]=a[i/10%10]=a[i/100]=a[i*2%10]=a[i*2/10%10]=a[i*2/100]=a[i*3%10]=a[i*3/10%10]=a[i*3/100]=1;
for(j=1;j<=9;j++) v+=a[j];
if(v==9) printf("%d %d %d
",i,i*2,i*3);
}
return 0;
}