T1: Conjugation
给定长为 \(N\) 的广义单调减小序列 \(A_1, A_2, \cdots, A_N\)
如图所示,从顶部开始的第 \(i\) 行有 \(A_i\) 个正方形。
对于 \(j = 1, 2, \cdots, A_1\),求从左起第 \(j\) 列有多少个方格。
限制:
- \(1 \leqslant N \leqslant 10^5\)
- \(1 \leqslant A_i \leqslant 10^5\)
- \(A_1 \geqslant A_2 \geqslant \cdots \geqslant A_N\)
算法分析
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
rep(i, n) cin >> a[i];
reverse(a.begin(), a.end());
for (int i = 1; i <= a.back(); ++i) {
cout << a.end() - lower_bound(a.begin(), a.end(), i) << ' ';
}
return 0;
}
T2:Shio Ramen
太郎是个挑剔的吃货,而二郎是个贪吃鬼。
二郎的桌子上有 \(N\) 碗盐味拉面。给这些盐味拉面分别编号为 \(1, 2, \cdots, N\) 。
对于每个 \(i\),第 \(i\) 碗盐味拉面的咸度为 \(s_i\),口味浓度为 \(a_i\) 。二郎和太郎一样,喜欢吃盐味拉面,二郎希望吃的盐味拉面味道越浓越好。
二郎很大胆,并不在乎他的盐拉面中的盐味有多浓。
但是,如果二郎吃的总盐味超过 I
就会生病。
作为二郎的朋友,你可以告诉他吃哪些盐味拉面不会生病,并让总的味道浓度达到最大。
限制:
- \(1 \leqslant N, I \leqslant 1000\)
- \(1 \leqslant s_i, a_i \leqslant 1000\)
算法分析
01背包
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
inline void chmax(int& x, int y) { if (x < y) x = y; }
int main() {
int n, I;
cin >> n >> I;
vector<int> s(n), a(n);
rep(i, n) cin >> s[i] >> a[i];
vector<int> dp(I+1);
rep(i, n) {
for (int j = I-s[i]; j >= 0; --j) {
chmax(dp[j+s[i]], dp[j]+a[i]);
}
}
cout << dp[I] << '\n';
return 0;
}