1 条题解

  • 0
    @ 2024-10-26 19:47:57

    ˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚

    首先这道题数据范围很小,最多只有10个数,而且最大就1000。1000以内的数质因子最多的就4个(这个大家可以自己写个代码求一下或者打个表观察)

    考虑暴力。 将每个数的所有质因子求出,分别存到对应的集合里面,每个集合分别取一个数算出所有满足条件的组合的和。

    直接用dfs求出所有满足条件的组合的值更新最小即可。 时间复杂度为每个集合元素个数的乘积。

    code:

    #include<bits/stdc++.h>
    using namespace std;
    
    int e[10][10]; //第一维表示第几个数,第二维存这个数的质因子
    int num[10]; //每个数的质因子的个数
    
    int n;
    int res = 1e9; //答案初始化为一个极大值,若没有更新则说明无法满足条件输出-1即可
    bool vis[1001]; 
    int a[15]; 
    
    bool check(int x) {   //判断是否为质数
        if(x <= 1) return false;
        for(int i = 2; i * i <= x; i++) {
            if(x % i == 0) return false;
        }
        return true;
    }
    
    void dfs(int u, int sum) { 
        if(u == n) {
            res = min(res, sum);
            return ;
        }
        for(int i = 0; i < num[u]; i++) {
            if(!vis[e[u][i]]) {
                vis[e[u][i]] = true;
                dfs(u + 1, sum + e[u][i]);
                vis[e[u][i]] = false;
            }
        }
    }
    
    //void solve() { 这一行没有注释哈,不加发不出来     
        cin >> n;
        for(int i = 0; i < n; i++) {
            cin >> a[i];
        }
        for(int i = 0; i < n; i++) {   
            for(int j = 1; j * j <= a[i]; j++) {
                if(a[i] % j == 0) {
                    if(check(j)) e[i][num[i]++] = j;
                    if(check(a[i] / j)) e[i][num[i]++] = a[i] / j;
                }
            }
        }
        dfs(0, 0);
        cout << (res == 1e9 ?  -1 : res) << "\n";
    //} 这一行没有注释哈,不加发不出来
    
    //signed main() { 这一行没有注释哈,不加发不出来
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        int t = 1; 
        // cin >> t;
        while(t--) solve();
    //} 这一行没有注释哈,不加发不出来
    

    ˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚

    信息

    ID
    1037
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    10
    已通过
    5
    上传者