C. 完善程序题

    客观题

完善程序题

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

完善程序题

下一个全排列

输入一个正数 nn (2n1062 \le n \le 10^6),以及-个长度为 nn 的排列、规定 (1,2,3,4,,n1,2,3,4,\cdots,n) 是第 11 个排列, (n,n1,,1n,n-1,\cdots,1) 是最后一个排列。

根据这 nn 个数组成的排列,输出下一个排列,每一个数后输出一个空格: 若这 nn 个数已经是最后一个排列,输出 No Next Permuation

5
1 2 5 4 3
1 3 2 4 5

程序

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, num, mid, t, a[10000001], b[1000001];
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  int i = n;
  while (i > 1) {
    if (__1___) {
      num++;
      b[num] = a[i];
    }
    else {
      num++;
      b[num] = a[i];
      num++;
      ___2___;
      mid = i - 2;
      break;
    }
    i--;
  }
  if (i == 1) ____3____;
  else {
    for (int i = 1; i <= num - 1; i++)
      if (____4____) {
        t = b[i];
        b[i] = b[num];
        b[num] = t;
        break;
      }
    for (int i = 1; i <= mid; i++) cout << a[i] << " ";
    cout << b[num] << " ";
    for (int i = 1; i <= num - 1; i++) ___5___;
    cout << endl;
  }
  1. (1) 处应该填写( )。

{{ select(34) }}

  • a[i] < a[i-1]
  • a[i+1] < a[i]
  • a[i] > a[i-1]
  • a[i+1] > a[i]
  1. (2) 处应该填写( )。

{{ select(35) }}

  • b[num]=a[i-2]
  • b[num+1]=a[i-1]
  • b[num+1]=a[i]
  • b[num]=a[i-1]
  1. (3) 处应该填写( )。

{{ select(36) }}

  • num++
  • mid=0
  • mid--
  • cout<<"No next Permuation"
  1. (4) 处应该填写( )。

{{ select(37) }}

  • b[i] > b[mid]
  • b[i] < b[mid]
  • b[i] < b[num]
  • b[i] > b[num]
  1. (5) 处应该填写( )。

{{ select(38) }}

  • cout << b[i+1] <<" "
  • cout << b[num-1] <<" "
  • cout << b[i-1] <<" "
  • cout << b[i] << " "

拓扑排序

给出一张 nn 个节点 mm 条边的有向图,求出该图的一个拓扑排序,若无拓扑排序输出 1-1

输入:

第一行两个正整数 n,mn,m 表示点数与边数。接下来 mm 行,每行两个正整数 x,yx,y 表示节点 xx 到节点 yy 之间有一条有向边。

输出:

一个拓扑序,按拓扑序输出点的编号。若拓扑序不唯一,输出任意一个均可。若无拓扑序,输出 1-1

关于拓扑序的例子,如学校里有 A,B,CDA,B,C,D 四门课程,要求课程 B,CB,C 必须在学习课程 AA 之后才能学习,课程 DD 必须在学习课程 B,CB,C 之后学习。则序列 ABCDABCD 与序列 ACBDACBD 均是合理的拓扑序,而序列 ABDCABDC 与序列 BACDBACD 等均不是拓扑序。即在安排某课程时,其前置课程必须全部学习完毕。

试补全程序。

#include <algorithm>
#include <cstdio>
#include <vector>
#define N 200020
using namespace std;
int n, m;
vector<int> G[N];
int q[N], hd, tl;
int du[N];
int ans[N], tot;
void topo() {
  hd = 1, tl = 0;
  for (int i = 1; i <= n; i++) if (__1__) q[++tl] = i;
  
  while (hd <= tl) {
    int u = q[hd++];
    ans[++tot] = u;
    for (int i = 0; ____2___; i++) {
      int v = G[u][v];
      du[v]--;
      if (!du[v]) ___3___
    }
  }
  if (tot != n) puts("-1");
  else {
    for (int i = 1; i <= n; i++) {
      printf("%d", ans[i]);
    }
  }
}

int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    __4__;
    __5__;
  }
  topo();
}
  1. (1) 处应该填写( )。

{{ select(39) }}

  • du[i]
  • q[i]
  • hd <= tl
  • !du[i]
  1. (2) 处应该填写( )。

{{ select(40) }}

  • i <= n
  • i < n
  • i < G[u].size()
  • i <= G[u].size()
  1. (3) 处应该填写( )。

{{ select(41) }}

  • q[++tl] = v
  • q[tl++] = v
  • q[++hd] = v
  • q[hd++] = v
  1. (4) 处应该填写( )。

{{ select(42) }}

  • G[y].push_back(x)
  • G[x].push_back(y)
  • G[x].push(y)
  • G[y].push(x)
  1. (5) 处应该填写( )。

{{ select(43) }}

  • G[y].push_back(x)
  • G[y].push(x)
  • du[y]++
  • du[x]++

粤港澳2023年初赛 - 小学组

未参加
状态
已结束
规则
IOI
题目
3
开始于
2025-5-3 9:00
结束于
2025-5-3 12:00
持续时间
3 小时
主持人
参赛人数
3