2023-01-14 online-sitemap-builder 0.1.0 をつくった / ABC015 の A, B, C, D を解いた
online-sitemap-builder 0.1.0 をつくった。 https://bouzuya.net/lab/online-sitemap-builder 。ソースコードは bouzuya/rust-sandbox の online-sitemap-builder に置いてある。
週の目標の達成と crates:yew の最低限の動作確認と bouzuya/rust-sandbox の sitemaps 改め sitemap-xml を試すためのもの。正直なところ、やっつけなので出すのが恥ずかしい。
sitemap-xml は 0.4.0 くらいまで上げるつもりで良さそうなら crates.io に公開することも考えている。それに合わせて online-sitemap-builder も lastmod などの指定などある程度のバージョンアップはすると思う。
そも sitemap.xml はおそらく手書きするものではなく自動生成されるものだと思うので、このアプリケーションには実用性がほとんどない。あえて sitemap 関連で何かやるならクローラーをつくって探索・生成させるようなものとか何か特殊なことをしないとまずそう。入力してボタンで追加みたいな UI をつけるよりも、優れた既存の editor コンポーネントを使って XML を編集可能にするほうが良いまでありそう。
ABC015 : AtCoder Beginner Contest 015 の A, B, C, D を解いた。
- A - 高橋くんの研修
https://atcoder.jp/contests/abc015/tasks/abc015_1
- 提出: https://atcoder.jp/contests/abc015/submissions/38003315
if a.len() < b.len() { b } else { a }
- B - 高橋くんの集計
https://atcoder.jp/contests/abc015/tasks/abc015_2
- 提出: https://atcoder.jp/contests/abc015/submissions/38003390
- ゼロじゃないものの数を数えて、和をとって、切り上げで割れば良い
let count = a.iter().copied().filter(|a_i| a_i != &0).count();
let sum = a.iter().sum::<usize>();
let ans = (sum + count - 1) / count;
- C - 高橋くんのバグ探し
https://atcoder.jp/contests/abc015/tasks/abc015_3
- 提出: https://atcoder.jp/contests/abc015/submissions/38006481
- 制約が小さいので素朴な DFS (再帰関数) で良い
- DFS による全探索が書けるかという問題
- D - 高橋くんの苦悩
https://atcoder.jp/contests/abc015/tasks/abc015_4
- 提出: https://atcoder.jp/contests/abc015/submissions/38008853
- ナップサック DP に 1 つ軸が増やされたもの
- ナップサック DP だと重さ・価値の 2 軸で、制約が重さだけ
- この問題では幅・枚数・重要度の 3 軸で、制約が幅と枚数になっている
- 遷移はナップサック DP と同様で貼るか貼らないかで
- 貼るなら幅が +A_i 枚数が +1 で重要度が +B_i される
DP[i][j][k] := i 番目まで見て j 枚を貼って k の幅になったときの重要度の総和の最大値
のような定義でループすれば良い (ぼくの回答では i が削ってあったり j, k の並びは異なるがほぼ同じ)
use proconio::input;
macro_rules! chmax {
($max_v: expr, $v: expr) => {
if $v > $max_v {
$max_v = $v;
true
} else {
false
}
};
}
fn main() {
input! {
w: usize,
n: usize,
k: usize,
ab: [(usize, usize); n],
};
let mut dp = vec![vec![0_usize; k + 1]; w + 1];
for (a, b) in ab.iter().copied() {
let mut next = vec![vec![0_usize; k + 1]; w + 1];
for j in 0..=k {
for l in 0..=w {
chmax!(next[l][j], dp[l][j]);
if j + 1 <= k && l + a <= w {
chmax!(next[l + a][j + 1], dp[l][j] + b);
}
}
}
dp = next;
}
let ans = dp
.iter()
.map(|dp_i| dp_i.iter().max().unwrap())
.max()
.unwrap();
println!("{}", ans);
}
今日のコミット。
- rust-atcoder 1 commit
- rust-sandbox 7 commits