作业介绍
d
// 宽度大的伞的价格不一定比小的价格低
// 6 4 6 3
// f[i]: 覆盖前 i 头牛需要的花费
// f[i]: 1 - i 头用一把伞, a[i] - a[1]+1 的花费
// :f[j] + cost(j+1 , i)
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 10;
const int M = 1e6 + 10;
int x[N], c[M] ;
int f[N], n, m;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> x[i];
sort(x + 1, x + 1 + n);
for (int i = 1; i <= m; i++)
cin >> c[i];
// 宽度大的伞的价格不一定比小的价格低
for (int i = m - 1; i >= 1; i--) {
if (c[i] > c[i + 1])
c[i] = c[i + 1];
}
memset(f, 0x3f, sizeof f);
f[0] = 0; // 初始化
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++)
f[i] = min(f[i], f[j] + c[x[i] - x[j + 1] + 1]);
}
cout << f[n];
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, a[N];
int q[N], t;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
q[++t] = a[1];
for (int i = 2; i <= n; i++) {
if (a[i] > q[t])
q[++t] = a[i];
else {
int id = lower_bound(q + 1, q + 1 + t, a[i]) - q;
q[id] = a[i];
}
}
cout << t;
return 0;
}
C
// 单调递增, a[i+1] >a[i]
// 单调不减 , a[i+1] >= a[i]
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int n, f[N];
int a[N];
int res;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
f[i] = 1; // 自己一个
// 放在之前的数字的末尾
for (int j = 1; j < i; j++) {
if (a[i] > a[j])
f[i] = max(f[i], f[j] + 1);
}
res = max(res, f[i]);
}
cout << res;
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int mod = 998244353;
#define int long long
int n, k, l[N], r[N];
int f[N];
int sum[N];
// 状态 , 转移方程, 优化
signed main() {
cin >> n >> k;
for (int i = 1; i <= k; i++)
cin >> l[i] >> r[i];
f[1] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
if (i - r[j] - 1 >= 0)
f[i] += sum[i - l[j]] - sum[i - r[j] - 1];
else if (i - l[j] >= 0)
f[i] += sum[i - l[j]];
f[i] %= mod;
}
sum[i] = (sum[i - 1] + f[i]) % mod;
}
cout << f[n];
return 0;
}
//for (int x = l[j] ; x <= r[j] ; x++) {
// if (i >= x)
// f[i] += f[i - x];
// f[i] %= mod;
//}
////
//l[i] = 1, r[i] = 3
//
//// 区间的左右端点:[i-r[j] , i - l[j]]
//// sum[i - l[j] ] - sum[i-r[j]-1]
//f[i - 3] f[i - 2] f[i - 1], 前缀和,求区间和 ,
//
//
//// 前缀和 , sum[i] = sum[i-1] +a[i]
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 19
- 开始时间
- 2026-4-1 0:00
- 截止时间
- 2026-4-30 23:59
- 可延期
- 24 小时