14 条题解
-
0
代码题解
思路
直接暴力,这个数据范围怕毛线
解题方法
如思路,暴力。
复杂度
时间复杂度:
Code
注:由于是答案题所以马蜂有点随意,不成问题。
#include<bits/stdc++.h> using namespace std; bool usd[10]; int main(){ for(int i=1;i<=9;i++){ usd[i]=true; for(int j=1;j<=9;j++){ if(usd[j])continue; usd[j]=true; for(int k=1;k<=9;k++){ if(usd[k])continue; usd[k]=true; int er=2*(i*100+j*10+k); if(er<1000&&er/100>0&&er/10%10>0&&er%10>0){ if(!usd[er/100]){ usd[er/100]=true; if(!usd[er/10%10]){ usd[er/10%10]=true; if(!usd[er%10]){ usd[er%10]=true; int san=3*(i*100+j*10+k); if(san<1000&&san/100>0&&san/10%10>0&&san%10>0){ if(!usd[san/100]){ usd[san/100]=true; if(!usd[san/10%10]){ usd[san/10%10]=true; if(!usd[san%10]){ cout<<i<<j<<k<<" "; cout<<er<<" "<<san<<endl; } usd[san/10%10]=false; } usd[san/100]=false; } } usd[er%10]=false; } usd[er/10%10]=false; } usd[er/100]=false; } } usd[k]=false; } usd[j]=false; } usd[i]=false; } return 0; }
-
0
B1题解
题目:
将1,2,…,9共9个数分成三组,分别组成三个三位数; 且使这三个三位数构成1:2:3的比例; 试求出所有满足条件的三个三位数。 例如:三个三位数: 192、384、576 满足以上条件。
相信大家跟我一样,读完题先是一愣当然,由于我是看到了1:2:3的比例; 所以先想到的就是用for循环
#include<bits/stdc++.h> using namespace std; int main(){ for(int i=100;i<=999;i++){ /* 这里呢,就是判断一下,是否可以构成1:2:3 So,只需要这样输出: */ cout<<i<<" "<<i*2<<" "<<i*3<<endl; } return 0; }
然后遇到了问题~~
哈哈,直接不对!!!emm..那就再看看,因为for循环中要用到i*3,所以 我们可以直接让i<=333,但只要仔细一读题,你会发现 题目中的第二的条件:
用1-9这9个数!!
有种被骗了的感觉ok,所以我们还要排除0 这是个
伟大的难点 所以我们可以这样做:-
让for循环的i 初始值为 111
纯粹较少时间,不改也行,好像没有大问题 -
也可以将i和i * 2,i * 3这几个数的每一位判断是不是0
因为给了是个三位数所以
- 百位:i/100
- 十位:i/10%10
- 个位:i%10
所以得到以下代码:
#include<bits/stdc++.h> using namespace std; int main(){ int one,two,three; for(int i=111;i<=333;i++){ one=i; two=i*2; three=i*3; if((one/100)!=0 && (one/10%10)!=0 && (one%10)!=0){ if((two/100)!=0 && (two/10%10)!=0 && (two%10)!=0){ if((three/100)!=0 && (three/10%10)!=0 && (three%10)!=0){ cout<<one<<" "<<two<<" "<<three<<endl; } } } } return 0; }
感觉良好,但是
过不了,哈哈emmmm.... 所以我们再次读题,发现是每个数只能用一次
这就好做了,只要判断每个数位乘起来是不是9!
和加起来是不是45(从1+到9)
所以得到以下代码:
#include<bits/stdc++.h> using namespace std; int main(){ int one,two,three; for(int i=111;i<=333;i++){ one=i; two=i*2; three=i*3; if((one/100)!=0 && (one/10%10)!=0 && (one%10)!=0){ if((two/100)!=0 && (two/10%10)!=0 && (two%10)!=0){ if((three/100)!=0 && (three/10%10)!=0 && (three%10)!=0){ if((one/100) * (one/10%10) * (one%10) * (two/100) * (two/10%10) * (two%10) * (three/100) * (three/10%10) * (three%10) == 1*2*3*4*5*6*7*8*9){ if((one/100) + (one/10%10) + (one%10) + (two/100) + (two/10%10) + (two%10) + (three/100) + (three/10%10) + (three%10) == 45){ cout<<one<<" "<<two<<" "<<three<<endl; } } } } } } return 0; }
你以为结束了??不可能!!!绝对不可能!!!这样虽然能过,可是大家有没有想过一个问题:
既然我们都已判断了三个数每个数的数位相加和相乘 那还有没有必要判断0呢???
对,没有必要
1.相乘,如有0,就是0 2.相加如果有,那么就会小于45吧!! 所以
删了吧!!最后的代码如下
Code
#include <bits/stdc++.h> using namespace std; int main(){ int one, two, three; for (int i = 111; i <= 333; i++){ one = i; two = i * 2; three = i * 3; if ((one / 100) * (one / 10 % 10) * (one % 10) * (two / 100) * (two / 10 % 10) * (two % 10) * (three / 100) * (three / 10 % 10) * (three % 10) == 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9){ if ((one / 100) + (one / 10 % 10) + (one % 10) + (two / 100) + (two / 10 % 10) + (two % 10) + (three / 100) + (three / 10 % 10) + (three % 10) == 45){ cout << one << " " << two << " " << three << endl; } } } return 0; }
最后完结撒花,开心
热知识
这个题目,有点... emmmmm.. -
-
0
直接python生成
1-9
全排列的组合,然后验证一下是否满足输出即可.Code
from itertools import permutations # 生成所有数字的排列 all = permutations('123456789') # 结果列表 results = [] # 遍历所有排列 for perm in all: # 分别取出第一个三位数、第二个三位数和第三个三位数 num1 = int(''.join(perm[:3])) num2 = int(''.join(perm[3:6])) num3 = int(''.join(perm[6:])) # 检查是否满足 1:2:3 的比例 if num2 == 2 * num1 and num3 == 3 * num1: results.append((num1, num2, num3)) # 按照第一个数从小到大的顺序输出 results.sort() # 打印结果 for result in results: print(result[0], result[1], result[2])
最后copy输出结果,提交即可
192 384 576 219 438 657 273 546 819 327 654 981
-
0
B1题解
思路很简单,直接用for枚举123到333之间的每一个数(因为333*3=999,已经是三位数的极限)
解题方法
直接判断,符合就输出
Code
#include<iostream> using namespace std; int a,b,c; int main() { for(int i=123;i<=333;i++) { a=i; b=i*2; c=i*3; if((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==1*2*3*4*5*6*7*8*9&&a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==45)//判断各个数位是否满足条件 { printf("%d %d %d",a,b,c); cout<<endl; } } return 0; }
最后
拒绝复制粘贴!!!!
-
-1
B1.三连击
思路
这道题刚拿到就想到使用递归一个数位一个数位去推 。 搞一个函数,参数有h表示推到了第几个数位和a,b,c。 a,b,c按照题意理解就行了。
但写代码的时候发现如果不优化递归,时间复杂度会变成,所以用了一个vis数组标记对应的1,2,3......这些数字在前面有没有被用过。
这样就减少了时间复杂度,又满足了题目中1到9每个数字只能用一次的限制条件。Code
#include<bits/stdc++.h> using namespace std; bool vis[105]; void fun(int h,int a,int b,int c) { if(h==10) { if(2*a==b && 3*a==c) cout<<a<<" "<<b<<" "<<c<<endl; return; } for(int i=1;i<=9;i++) { if(!vis[i]) { vis[i]=1; if(h<=3) fun(h+1,a*10+i,b,c); else if(h<=6) fun(h+1,a,b*10+i,c); else fun(h+1,a,b,c*10+i); vis[i]=0; } } } int main() { fun(1,0,0,0); return 0; }
- 1
信息
- ID
- 32
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 327
- 已通过
- 174
- 上传者