P1008

本文探讨了P1008题目中的关键编程思想,强调了搜索策略在解决此类问题时的重要性。文章指出,全排列的搜索方法虽然直观但实现复杂,而基于特定条件的单层循环搜索则更为简洁高效。提供了AC代码作为解决方案。
摘要由CSDN通过智能技术生成

题面
在这里插入图片描述
本文主要记录该题涉及的重要的编程思想

code的本质是搜索,但是从哪个角度搜索,其复杂度大相径庭

两种可行的搜索思路:

  • 1..9这9个数的全排列作为搜索空间(9*8*7*...*1=362880),判断每种情况是否满足1:2:3的比例关系
  • 100..333作为搜索空间(334个数),判断每种情况是否属于1..9这9个数的全排列

第一种搜索方式,全排列空间的遍历很难写,搜索空间很大
第二种搜索方式,单层for循环就能解决问题,搜索空间较小

AC代码如下:

/*********************************************************
 * 
 *
 *
 * 
 *********************************************************/
#include<cstdio>
#include<cstring>
int tong[9];
bool func(int a){
	while(a!=0){
		int tmp = a%10;
		if(tmp==0)return false;
		if(tong[tmp-1]==0)tong[tmp-1]=1;
		else return false;
		a/=10;
	}
	return true;
}
int main(){
	for(int i=100;i*3<1000;i++){
		memset(tong, 0, sizeof(tong));
		if(!(func(i) && func(i*2) && func(i*3)))continue;
		printf("%d %d %d\n", i, i*2, i*3);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值