競プロ典型90問をRustで解いていこう(適切な前処理)1日目

2022-03-04

はじめに

競プロ典型90問をRustで解いていこう(準備)0日目

スターオーシャン3のバトルコレクションのように、気長にやっていこうと思っています。 手始めに最低難易度として紹介されていた004 - Cross Sum(★2)を解いていこうと思います。

Rustの勉強も兼ねているので、しばらくはRustで解いていきます。

004 - Cross Sum(★2)

グリット上の各交点に数字が並んでおり、各点の縦と横の値の合計を計算する問題です。

入力例 1 1 1 1 1 1 1 1 1

出力例 5 5 5 5 5 5 5 5 5

方針

適切な前処理ということで、各マスで縦と横の値を都度都度取得して合計するのもやり方としてはあります。 ただ、縦方向、横方向の合計はそれぞれ各行と列で一意に決まるため事前に計算しておいてリストをもたせるのが良いかと思います。

Rustでの回答例

空のVector配列を用意して、各行列の合計を算出しておき、各座標で縦と横の合計を足して、重複している現座標の値を引いたら求めていた結果が出ます。

use proconio::input;

fn main() {
    input! {
        h: usize,//行
        w: usize,//列
        mut a: [[i32; w];h]
    }

    let mut row = vec![0; h];
    let mut col = vec![0; w];

    for i in 0..h {
        for j in 0..w {
            row[i] += a[i][j];
            col[j] += a[i][j];
        }
    }

    for i in 0..h {
        for j in 0..w {
            print!("{} ", row[i] + col[j] - a[i][j]);
        }
        println!();
    }
}

まとめ

まずは一日目簡単な問題から解けました。 良かった…。