时间:2022/9/1 19:00~21:00 选择题 10 道,不定项 填空题 10 道 编程题三道 一、输入一个长度为 n 的数组及 k,循环比较数组的前两个元素,将较大的一个放在数组首位,将较小的一个放在数组末位,求连续胜利 k 次的数字。

#include<iostream>
#include<list>
#include<cmath>
using namespace std;
int main() {
list arr;
int k;
int n = 0;
int m = 0;
int flag;
while (cin >> k) {
arr.push_back(k);
n++;
flag = m;
m = max(m, k);
}
arr.pop_back();
if (k < n - 1) {
int flag = 0;
int ans = 0;
ans = arr.front();
arr.pop_front();
while (flag < k) {
if (ans > arr.front()) {
flag++;
arr.push_back(arr.front());
arr.pop_front();
}
else {
flag = 1;
arr.push_back(ans);
ans = arr.front();
arr.pop_front();
}
}
cout << ans << endl;
}
else {
cout << flag << endl;
}
return 0;
}

二、输入长度为 n 的数组,求最大排序连续上升子段长度(输出 1 过 60%)

#include<iostream>
using namespace std;
int main() {
cout << 1 << endl;
return 0;
}

三、输入 n 和 k,输入长度为 n 的数组,求按顺序侵入需要变换的最少次数(侵入要求为所取的值与当前元素值绝对值小于等于 k,初始值可为任意值且不计入次数)

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
long long t;
vector arr;
for (int i = 0;i < n;i++) {
cin >> t;
arr.push_back(t);
}
long long m1 = 10000000000, m2 = 0;
int ans = 0;
for (int i = 0;i < arr.size();i++) {
long long m3 = min(m1, arr[i]);
long long m4 = max(m2, arr[i]);
if (m4 - m3 > 2 * x) {
ans++;
if (m3 != m1) {
m1 = m3;
m2 = m3;
}
else if (m4 != m2) {
m2 = m4;
m1 = m4;
}
}
else {
m1 = m3;
m2 = m4;
}
}
cout << ans << endl;
return 0;
}