洛谷打卡 Day2

题目描述

将 1,2,…,9共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C试求出所有满足条件的三个三位数,若无解,输出 No!!!。

输入格式

三个数,A,B,C。

输出格式

若干行,每行 333 个数字。按照每行第一个数字升序排列。

输入输出样例
输入

1 2 3

输出

192 384 576
219 438 657
273 546 819
327 654 981

说明/提示

保证 A<B<C。

题解

#include<iostream>
   using namespace std;
   int a[10], vis[10] = {0};
   int x,y,z,  f = 0;    
   void print()
   {              
       cout<<a[1]*100+a[2]*10+a[3]<<" ";
       cout<<a[4]*100+a[5]*10+a[6]<<" ";
       cout<<a[7]*100+a[8]*10+a[9]<<endl;
       f = 1;                
   }
   void dfs(int n)                                      
   {
       for(int i = 1; i <= 9; i++)
       {
           if(vis[i] == 0){                                   vis   用来判断是否重复
                a[n] = i;
               vis[i] = 1;
               if(n == 9&&            
                   (a[1]*100 + a[2]*10 + a[3])*y==
                   (a[4]*100 + a[5]*10 + a[6])*x&&
                   (a[4]*100 + a[5]*10 + a[6])*z==             这个超级长的if  用来检验是否找完9个数和是否符合条件
                   (a[7]*100 + a[8]*10 + a[9])*y&&
                   (a[1]*100 + a[2]*10 + a[3])*z==
                   (a[7]*100 + a[8]*10 + a[9])*x)
                   print();
               else dfs(n + 1);
               vis[i] = 0;
           }
       }
   }
   int main(){
       cin>>x>>y>>z;
       dfs(1);              
       if(f == 0)
       cout<<"No!!!"<<endl; 
}

题目描述

已知 n个整数 x1,x2,…,x以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3。4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29

输入格式

键盘输入,格式为:

n,k(1≤n≤20,k<n)

x1,x2,…,xn(1≤xi≤5000000)

输出格式

屏幕输出,格式为: 1个整数(满足条件的种数)。

输入输出样例
输入

4 3
3 7 12 19

输出

1

题解

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int ans=0,num=0;
int a[24],n,k;

bool prime(int num)
{
    int i;
    if(num==2)
    return 1;
    for(i=2;i<ceil(sqrt(num));i++)                            判断是否为素数    只需遍历到num平方根   ceil取整函数
                                                            一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并
                                                            不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数
    {
        if(num%i==0)
        return 0;
    }
    return 1;
}

void dfs(int x,int y)
{
    int i;
    if(x>k)
    {
        if(prime(num))
        ans++;
        return;
    }
    else
    {
        for(i=y+1;i<=n;i++)
        {
            num=num+a[i];
            dfs(x+1,i);
            num=num-a[i];
        }
    }
    

两道深搜,让我秃头。感觉第一道题的深搜,有点神奇(滑稽)。

posted @ 2020-04-07 17:06  猫与小岛  阅读(143)  评论(1)    收藏  举报