CSP-202209-1-如此编码

CSP-202209-1-如此编码

解题思路

  • 核心逻辑在于利用arr1arr2两个数组来逐步计算出每个c[i]被使用的次数,这些次数即为题目中的b[i]
  • arr1[i] = m % c[i]用于计算在用c[i]整除m后的余数,这个余数表示在当前级别i上,m还需要多少才能被c[i]整除。
  • arr2[i]表示从m中减去i-1级别已经选择的部分后,剩余的部分。arr2[i] = arr1[i] - arr2[i - 1]是用来更新m的值,保证每一步的选择都是基于剩余的m进行的。
#include 
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int* a = new int[n + 1];
    int* c = new int[n + 1];
    int* arr1 = new int[n + 1];
    int* arr2 = new int[n + 1];

    for (int i = 0; i < n + 1; i++)
    {
    
        a[i] = 0;
        c[i] = 1;
        arr1[i] = 0;
    }

    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        c[i] = a[i] * c[i - 1];
        arr1[i] = m % c[i];
    }

    arr2[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        arr2[i] = arr1[i] - arr2[i - 1];
        // b[i]
        cout << arr2[i] / c[i - 1] << " ";
    }
    
    delete[]a;
    delete[]c;
    delete[]arr1;
    delete[]arr2;

    return 0;
}

请添加图片描述

你可能感兴趣的:(算法,c++)