第一题:缺少的数
思路:排序后查找
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int main()
{
cin >> n;
for(int i = 0; i < n - 1; i ++) cin >> a[i];
bool flag = false;
sort(a, a + n - 1);
for(int i = 0; i < n - 1; i ++){
if(a[i] != i + 1){
cout << i + 1 << endl;
flag = true;
break;
}
}
if(!flag) cout << n << endl;
return 0;
}
第二题:选区间
思路:将两个数组排序后对两个数组的第一个的区间和最后区间进行比较,注意要比较两次
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
PII a[N], b[N];
int n, m;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++){
int l, r;
cin >> l >> r;
a[i] = {l, r};
}
cin >> m;
for(int i = 0; i < m; i ++){
int l, r;
cin >> l >> r;
b[i] = {l, r};
}
int flag = 0, sum = 0;
sort(a, a + n, [](const PII &x, const PII &y){ return x.second < y.second; });
sort(b, b + m);
int r = b[m - 1].first, l = a[0].second;
if(r >= l){
flag = 1;
sum = r - l;
}
sort(a, a + n);
sort(b, b + m, [](const PII &x, const PII &y){ return x.second < y.second; });
l = b[0].second, r = a[n - 1].first;
sum = max(sum, r - l);
if(sum < 0) cout << 0 << endl;
else cout << sum << endl;
return 0;
}
第三题:迭元素
思路:闫氏Dp分析法:
需要注意的点:数组要用long long 来存放(别问我为什么知道,因为实测会爆int)
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
typedef long long LL;
int a[N];
LL f[N][N];
int n, m, k;
int main()
{
cin >> n >> k >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
memset(f, -0x3f, sizeof f);
f[0][0] = 0;
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= m; j ++){
for(int p = max(0, i - k); p < i; p ++){
f[i][j] = max(f[i][j], f[p][j - 1] + a[i]);
}
}
}
LL res = -1;
for(int i = n - k + 1; i <= n; i ++) res = max(res, f[i][m]);
cout << res;
return 0;
}