#1777. 珅泽教育CSP-J第一轮模拟考第八套 第 36 题

珅泽教育CSP-J第一轮模拟考第八套 第 36 题

三、完善程序(单选题,每小题3分,共计30分)

第1题

solve(int n, int a[]) 解决的问题是:给定 nn 个整数 a1,a2,,ana_1,a_2,\ldots,a_n,每个数字都是 0,1,20,1,2 中的一个。不断交换这个序列中的任意两个数字,让这个序列成为升序,函数返回最少需要的交换次数。

int cal(int q[3][3], int u, int v)
{
    int pair = std::min(____(1)____);
    q[u][v] -= pair;
    q[v][u] -= pair;
    return pair;
}

int solve(int n, int a[])
{
    int c[3] = {0, 0, 0};
    for (int i = 0; i < n; ++i)
    {
        ____(2)____;
    }

    int q[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
    for (int i = 0; i < n; ++i)
    {
        int from = ____(3)____;

        int to;
        if (i < c[0])
            to = 0;
        else if (i < ____(4)____)
            to = 1;
        else
            to = 2;

        q[from][to]++;
    }

    int sum = 0;
    sum += cal(q, 0, 1);
    sum += cal(q, 0, 2);
    sum += cal(q, 1, 2);
    sum += 2 * (____(5)____);
    std::cout << sum << "\n";
}

(1) 处应填( )。

{{ select(1) }}

  • a[u],a[v]
  • c[u],c[v]
  • q[0][v], q[0][u]
  • q[u][v], q[v][u]