首页 > 试题广场 >

kotori和素因子

[编程题]kotori和素因子
  • 热度指数:5840 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}kotori 拿到 n互不相同的正整数 a_1,a_2,\dots,a_n。她要从每个 a_i 中选出一个素因子 p_i,要求所有选出的素因子两两不同,即 p_i\neq p_j\;(i\neq j)

\hspace{15pt}若无法满足要求输出 -1;否则输出所有选出的素因子之和 \displaystyle\sum_{i=1}^{n}p_i 的最小可能值。

输入描述:
\hspace{15pt}第一行输入整数 n\left(1\leqq n\leqq 10\right)
\hspace{15pt}第二行输入 n 个两两不同的整数 a_i\left(2\leqq a_i\leqq 1000\right)


输出描述:
\hspace{15pt}若存在合法选取方案,输出最小可能和;否则输出 -1
示例1

输入

4
12 15 28 22

输出

17

说明

可取素因子 [3,5,7,2],和为 17;任意合法方案的和都不小于 17
示例2

输入

5
4 5 6 7 8

输出

-1

备注:

package main

import (
    "fmt"
    "math"
)

func main() {
    var n int
    fmt.Scan(&n)
    arr:=make([][]int,n)
    var x int
    for i:=0;i<n;i++{
        fmt.Scan(&x)
        tmp:=make_arr(x)
        arr[i]=tmp
    }
    // fmt.Printf("%v\n",arr)
    min:=math.MaxInt32
    vis:=map[int]bool{}
    var dfs func(int,int)
    dfs=func(j int,sum int){
        if j==n{
            if sum<min{
                min=sum
            }
            return
        }
        for i:=0;i<len(arr[j]);i++{
            x:=arr[j][i]
            if _,ok:=vis[x];ok{
                continue
            }
            sum+=x
            vis[x]=true
            dfs(j+1,sum)
            sum-=x
            delete(vis,x)
        }
    }
    dfs(0,0)
    if min==math.MaxInt32{
        fmt.Println(-1)
        return
    }
    fmt.Println(min)
}

func make_arr(x int)[]int{
    ans:=[]int{}
    for i:=2;i<=x;i++{
        if x%i==0&&check(i){
            ans=append(ans,i)
        }
    }
    return ans
}

func check(x int)bool{
    for i:=2;i<x;i++{
        if x%i==0{
            return false
        }
    }
    return true
}

发表于 2023-03-05 14:32:06 回复(0)

问题信息

难度:
3条回答 2574浏览

热门推荐

通过挑战的用户

查看代码
kotori和素因子