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

Author Avatar
Patrick 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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;
}