三次大作業の振り返りと実装ノウハウ

最初に、問題クラス(Ques)、試験クラス(Test)、解答カードクラス(anscard)、学生クラス(Student)を定義しました。 Ques: num(番号), ques(問題文), ans(正解), pd(正誤判定), fen1(配点), fen2(得点), y(状態) Test: num2(試験番号), List<Ques>l(問題リスト), sum(総得点) anscard: num3(試験番号), man(学籍番号), List<Ques>card(解答リスト) Student: nam ...

10月22日 22:27 投稿

C言語における関数の設計と実装:基本から再帰処理まで

関数の基本概念 C言語における関数は、数学の関数と類似した概念を持ちます。特定の入力(引数)を受け取り、定義された処理を実行して結果(戻り値)を返す独立したモジュールです。例えば、入力値を二乗して1を足す処理を関数として実装すると以下のようになります。 #include <stdio.h> int calculate(int val) { return val * val + 1; } int main(void) { ...

10月17日 06:15 投稿

穴あきグリッドにおける有効な正方形の数え上げと動的計画法による最適化

$H \times W$ のグリッド上に $N$ 個の「穴(障害物)」が存在する際、穴を一切含まない正方形がいくつ存在するかを計算する問題は、動的計画法(DP)の典型的な応用例です。本記事では、この問題に対する直感的だが誤ったアプローチの分析と、それを修正した最適なアルゴリズムについて解説します。 誤ったアプローチ:独立した連続長に基づく累積和 まず考えられがちな ...

10月14日 09:16 投稿

学習記録(Day 3)- 文字列処理の実践問題

本日は「文字列」をテーマとした2つの問題を解きました。 問題1:高精度浮動小数点の加算 この問題は典型的なアルゴリズム問題であり、桁数が非常に大きな数値の加算を効率的に処理する方法を習得できます。 問題リンク:浮点数加算 解決策として、整数部と小数部を別々に処理するアプローチを採用しました。以下が実装コードです: #include <cstdio> #include ...

10月6日 20:11 投稿

アルゴリズム競技向け:シミュレーション・ビット演算・ハッシュ最適化の実践

本記事では、代表的なアルゴリズム問題を題材に、配列走査、プレフィックス和、ビット操作、ハッシュマップによる高速化の4つの核心技術を解説します。各問題は段階的に難易度が上がり、実装の背景にある設計思想と数学的洞察を重視して解説します。 1. 中央要素の条件判定(初級) 整数配列 a が与えられる。インデックス i(先頭と末尾を除く)について、a[i] ≥ a[i-1] ...

10月4日 07:33 投稿

全列挙問題におけるDFSとNext Permutationアルゴリズムの比較と実装

全列挙問題における効率的な解法 DFS(深さ優先探索)の実装 再帰を用いたバックトラッキングアプローチで、以下の特徴を持つ: import java.util.*; public class PermutacaoDFS { public List<List<Integer>> gerarPermutacoes(int[] dados) { List<List<Integer>> resultado = new ArrayList(); boolean[] visitado = ...

9月30日 07:57 投稿

配列と集合の問題解説: Codeforces Round 932 (Div. 2)

C. メッセンジャープログラム 2つの配列aとb、および整数Lが与えられます。aとbのインデックスのシーケンスpを見つけて、\(\sum a_{p_i} + \sum |b_{p_i}-b_{p_{i+1}}| \leq L\)を満たす必要があります。 解法 キー1:bを昇順にソートすることが最適です。 キー2:固定された\(b_l\)と\(b_r\)に対して、\(\sum^r_l |b_{p_i}-b_{p_{i+1}}| = b_r - b_l\)となり、これは固定 ...

9月28日 13:57 投稿

主要アルゴリズムとデータ構造:累積和、差分、二分探索、貪欲法

本稿では、プログラミングコンテストやアルゴリズム学習で頻繁に利用される基本的なアルゴリズムについて解説します。特に、配列操作を効率化する線形次元削減テクニック、そして二分探索、貪欲法といった重要な解法に焦点を当てます。 線形次元削減のテクニック 累積和と差分配列 累積和(Prefix Sum)は、配列の特定区間の合計値を効率的に計算するための手法です。与え ...

9月16日 03:52 投稿

データ構造詳解:木構造と二分木の理論から実装まで

木構造の基礎概念 定義と特徴 木構造は、再帰的に定義される階層型データ構造です。要素数が n (n ≥ 0) の有限集合であり、n = 0 の場合は空木と呼ばれます。非空木において以下の条件を満たします: 根ノードは唯一存在し、前駆ノードを持ちません。 根以外の子ノードは、互いに素な部分木として分類され、各ノードは厳密に1つの親を持ちます。 各ノードは0個以上の後続 ...

9月14日 19:37 投稿

二分探索木における最小絶対差と最頻値、および二分木の共通祖先探索アルゴリズム

1. 二分探索木における最小絶対差の取得 二分探索木(BST)の性質として、中序巡回(In-order Traversal)を行うと、ノードの値を昇順で取得できるという特徴があります。この性質を利用することで、隣接するノード間の差分を比較し、最小絶対差を効率的に求めることが可能です。 ポインタ prevNode を使用して、常に現在のノード currNode の直前の値を保持するこ ...

9月14日 13:56 投稿