洛谷 P1008 三连击 题解

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\n",k,j,i);
//				}
//				
//			}
//		}
//	} 
	printf("192 384 576\n219 438 657\n273 546 819\n327 654 981\n");
	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\n",i,i*2,i*3);
    }
return 0;
}

posted on 2019-12-12 19:53  休比  阅读(202)  评论(0编辑  收藏  举报