14 条题解

  • 0
    @ 2024-10-23 22:27:25

    A simple mathmatics problem

    The simplest way to solve the problem: Calculate by yourself!

    Answer: 192 384 576 219 438 657 273 546 819 327 654 891

    Actually, there is a mistake above. What is it? I believe you can find it!

    • 0
      @ 2024-9-28 16:45:10

      代码题解

      思路

      直接暴力,这个数据范围怕毛线

      解题方法

      如思路,暴力。

      复杂度

      时间复杂度:

      O(n3)O(n^3)

      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
        @ 2024-9-16 17:19:13

        B1. 三连击

        直接手算即可。

        192 384 576
        219 438 657
        273 546 819
        327 654 981
        
        • 0
          @ 2024-9-16 14:41:55

          其实并没有啥难度,手推即可

          192 384 576
          219 438 657
          273 546 819
          327 654 981
          
          • 0
            @ 2024-9-15 7:41:37

            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 这是个伟大的难点 所以我们可以这样做:

            1. 让for循环的i 初始值为 111 纯粹较少时间,不改也行,好像没有大问题

            2. 也可以将i和i * 2,i * 3这几个数的每一位判断是不是0

            因为给了是个三位数所以

            1. 百位:i/100
            2. 十位:i/10%10
            3. 个位: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
              @ 2024-9-8 20:14:46

              B1 三连击题解:

              思路:直接手算,最后把答案提交上去

              192 384 576
              219 438 657
              273 546 819
              327 654 981
              
              • 0
                @ 2024-8-31 11:45:11

                直接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
                  @ 2024-8-29 13:42:17

                  水题...

                  没啥好说的,直接手算就行。

                  192 384 576
                  219 438 657
                  273 546 819
                  327 654 981
                  
                  • 0
                    @ 2024-8-21 22:43:48

                    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
                    @ 2024-9-22 16:26:42

                    B1.三连击

                    思路

                    这道题刚拿到就想到使用递归一个数位一个数位去推 。 搞一个函数,参数有h表示推到了第几个数位和a,b,c。 a,b,c按照题意理解就行了。
                    但写代码的时候发现如果不优化递归,时间复杂度会变成999^{9},所以用了一个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
                      @ 2024-8-25 19:13:34

                      #include<bits/stdc++.h> using namespace std; int main(){ cout<<"192 384 576"<<endl; cout<<"219 438 657"<<endl; cout<<"273 546 819"<<endl; cout<<"327 654 981"<<endl; reutrn 0; }

                      • @ 2024-8-25 22:27:19

                        你过了吗,过了的话是怎么上传答案的?

                    • -3
                      @ 2024-9-16 12:50:09

                      解题方法

                      手算答案即可

                      Key

                      192 384 576
                      219 438 657
                      273 546 819
                      327 654 981
                      
                      • -4
                        @ 2024-9-26 19:18:43

                        B1.三连击


                        直接手算即可

                        Code

                        192 384 576
                        219 438 657
                        273 546 819
                        327 654 981
                        
                        • -5
                          @ 2024-8-16 19:14:26

                          B1. 三连击

                          本人用了一个很离谱的方法,我直接在纸上把答案算出来了(我也没想到就这么点)

                          所以,直接输出

                          Code

                          #include<bits/stdc++.h>

                          using namespace std;

                          int main(){

                          cout<<"192 384 576"<<endl;

                          cout<<"219 438 657"<<endl;

                          cout<<"273 546 819"<<endl;

                          cout<<"327 654 981"<<endl;

                          reutrn 0;

                          }

                          ##完美结束

                          • 1

                          信息

                          ID
                          32
                          时间
                          1000ms
                          内存
                          256MiB
                          难度
                          3
                          标签
                          递交数
                          327
                          已通过
                          174
                          上传者