复试准备指二零零七到二零一二上机题

Author Avatar
patrickcty 3月 09, 2019
  1. 一群人(排列的编号从 1 到 N,N 可以设定)围成一圈,按一定规则出列。剩余的人仍然围成一圈,出列规则是顺着 1 到 N 的方向对圈内的人从 1 到 C 记数(C 可以设定)。圈内 记数为 C 的人出列。剩余的人重新计数。按上述规则,让圈内所有的人出列。请编程输出 出列编号的序列。

例:

若 N=3,C=1,则出列编号的序列为 1,2,3

若 N=3,C=2,则出列编号的序列为 2,1,3

# include <iostream>

using namespace std;

int main() {

    int n, c;
    while (cin >> n >> c) {
        int out[1000] = {0};
        int cnt = n;  // 没有出列的人数
        int num = 1;  // 报数
        int no = 0;  // 排列编号
        while (cnt) {
            if (out[no] == 1) {
                no = (no + 1) % n;
                continue;
            }
            if (num == c) {
                cout << no + 1 << ' ';
                out[no] = 1;
                num = 1;
                cnt--;
            }
            else {
                num++;
            }
            no = (no + 1) % n;
        }
        cout << endl;
    }

    return 0;
}
  1. 输入一个循环数组(数组的最后一个元素的下一元素为数组的第一个元素),依次打印出 数组中所有元素的下一个比这个元素更大的值(按数组下标大小搜寻,可以循环),如果不 存在更大的元素,打印-1。

例:

输入:

6

1 2 1 6 3 4

输出:2 6 6 -1 4 6

# include <iostream>

using namespace std;

int main() {

    int n;
    int a[1000];
    while (cin >> n) {
        int mmax = -1;
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
            if (a[i] > mmax) {
                mmax = a[i];
            }
        }

        for (int i = 0; i < n; ++i) {
            if (a[i] == mmax) {
                cout << -1 << ' ';
                continue;
            }
            int next = (i + 1) % n;
            while (1) {
                if (a[i] < a[next]) {
                    cout << a[next] << ' ';
                    break;
                }
                next = (next + 1) % n;
            }
        }
        cout << endl;
    }

    return 0;
}