40分 求助大佬
查看原帖
40分 求助大佬
472628
Mandel520楼主2022/2/27 14:01

我的思路

读入 m1, 将它的所有因子分解至 m1_factors[] 数组中

依次读入nSi

对于每一种 Si, 首先将它的所有因子分解至si_factors[]数组中

然后遍历 m1_factors[]中的所有因子, 判断 Si是否也有这个因子, 如果没有, 则当前Si无解

如果Si包含了m1的所有因子, 则找到它们所有的共同因子, 将m1的因子的幂次减去Si的因子的幂次即为当前Si 的解

找到所有Si的解的最小值, 作为答案

#include<stdio.h>

int n;      //一共n种细胞
int m1, m2; //试管总数(m1^m2)
int Si;     //细胞数量
int ans = 2000000005; //最短时间

typedef struct factor{
    int factor;  //因子
    int cnt;     //这个因子出现的次数(幂次)
}factor;

factor m1_factors[10010]; //储存m1的所有因子和因子出现次数
factor si_factors[10010]; //储存Si的所有因子和因子出现次数(幂次)

int Decomposition(int x, factor arr[]){ //将x的每个因子的值和出现次数记录在arr[]中
    int idx = 0;
    for (int i = 2; i * i <= x; i++){
        if (x % i == 0) arr[++idx].factor = i, arr[idx].cnt = 0; //记录因子
        while(x % i == 0){
            arr[idx].cnt++;  //记录因子的幂次
            x /= i;
        }
    }
    if (x > 1){ //如果没有分解完, 则剩下的数也是一个因子
        arr[++idx].factor = x;
        arr[idx].cnt = 1;
    }
    return idx;  //返回因子数
}

int max(int a, int b){  //取最大值
    if(a > b) return a;
    return b;
}

int min(int a, int b){  //取最小值
    if(a < b) return a;
    return b;
}

int main(){
    scanf("%d %d %d", &n, &m1, &m2);
    int m1_cnt = Decomposition(m1, m1_factors); //分解m1

    while (n--){ 
        scanf("%d", &Si); //读入当前细胞的数量
        int si_cnt = Decomposition(Si, si_factors); //分解Si

        int x = 0; //细胞的分裂时间

        for (int i = 1; i <= m1_cnt; i++){ //枚举m1的所有因子
            if (Si % m1_factors[i].factor != 0){ //m1中有Si没有的因子, 则无解
                x = -1; //无解
                break;
            }
        }

        if (x != -1){ //如果有解, 则计算x的值
            int idx2 = 1;
            for (int idx1 = 1; idx1 <= m1_cnt; idx1++){
                //找到Si中与m1中相同的因子
                while(si_factors[idx2].factor != m1_factors[idx1].factor) idx2++;
                //m1中因子的幂次 - Si中因子的幂次 即为x的取值
                x = max(x, m1_factors[idx1].cnt - si_factors[idx2].cnt + 1);
            }
        }

        if (x >= 0) ans = min(ans, x); //记录答案的最小值
    }

    if (ans >= 200000000) puts("-1");
    else printf("%d\n", ans);

    return 0;
}

但是只拿了40分, 因此请求各位大佬指出问题

2022/2/27 14:01
加载中...