第一题:题目描述:
给定一个字符串,里面包含n个数,其中前n-1个数是数组序列,第n个数是需要赢的次数。这里是比较a[0]和a[1],比较大的数字保持不动,小的数字放在数组最后,每次都是比较a[0]和a[1]。求出第一个赢k次的数字
题目输入
3 2 1 10
题目输出
3
思路:太简单了自己看
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> a;
int t, k = 1, mx;
while (cin >> t) {
a.emplace_back(t);
}
mx = a[0];
for (int i = 1; i < a.size() - 1; i ++) {
if (a[i] > mx) {
k = 1;
mx = a[i];
} else k ++;
if (k >= a.back()) {
cout << mx;
return 0;
}
}
cout << mx;
}
第二题:给定一个数组,求出最大排序连续上升序列
题目输入
3 1 2 4 6
题目输出
4
思路:没看懂题写了三四份不同的代码都只过了90%
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 5e3 + 10;
int n, a[N];
int main() {
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> a[i];
}
int res = 1;
for (int v = 1; v <= n; v ++) {
sort(a, a + v);
if (a[v - 1] - a[0] == v - 1)
res = v;
}
cout << res;
}
第三题:给定一个n和x,给定一个数组a一个人的伪装度是v,任意值都可以,可以更改为任意数。
n台机器,每台机器的敏感度是a[i],要求按顺序入侵每个装置,能不能入侵的判断是|a[i]-v|<=x即
可。中途可以更改v,求如果能按顺序入侵每台机器,则最少需要更改伪装度几次?
题目输入
5 4 4 9 6 7 8
题目输出
0
思路:记录每一个位置可选的区间,一个个往后面遍历缩小范围,当前区间与缩小后的区间没有交集时需要改变一次伪装度
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1e5 + 10, INF = 1e9 + 7;
int n, x;
int a[N][2];
int main() {
cin >> n >> x;
for (int i = 0; i < n; i ++) {
int t;
cin >> t;
a[i][0] = t - x, a[i][1] = t + x;
}
int k = 0, ll = -1, lr = INF;
for (int i = 0; i < n; i ++) {
auto &[l, r] = a[i];
if (l > lr || r < ll) {
k ++;
ll = l, lr = r;
} else {
lr = min(lr, r);
ll = max(ll, l);
}
}
cout << k;
}