企業推薦の最適化アルゴリズム

プログラミングコンテスト終了後、企業の採用担当は成績優秀者を推薦する必要がある。推薦条件は以下の通り: コンテスト得点が175点以上であること 最大K回の推薦ラウンドが可能 各ラウンドでは得点が厳密に増加する順序で推薦 PAT試験の合格者(スコアが基準以上)は同点でも推薦可 入力形式 最初の行には3つの整数N(≤10⁵)、K(≤5×10³)、S(≤100)が与えられる。続 ...

7月31日 17:31 投稿

競技プログラミングにおける主要アルゴリズム実装テクニック集

高速入出力と座標圧縮 大量のデータ処理を行う際、標準的な入出力関数はボトルネックになることがあります。以下では、カスタム関数による高速化と、std ライブラリを使用した最適化の両方を示します。 #include <bits/stdc++.h> using namespace std; // カスタム関数による高速入力 inline int fastRead() { int val = 0; char ch = getchar(); bool ...

7月27日 18:41 投稿

K差分構成問題の解法

問題概要 長さ n の 01 文字列 s が与えられる。一部の文字は ? となっており、これらを 0 または 1 に置き換える必要がある。 良い配置とは、1 ≤ i < n を満たす異なる i がちょうど m 個存在し、かつ s[i] ≠ s[i+1] となるものをいう。 すべての良い配置の中で辞書順最小のものを求めよ。解が存在しない場合は Impossible を出力せよ。 解法 まず、現在の文字列におけ ...

7月25日 23:01 投稿

Codeforces ラウンド 996 (Div. 2) 問題解説

問題 A: 二匹のカエル 問題リンク:https://codeforces.com/contest/2055/problem/0 アプローチ: アリスが先手で勝つ状況は、位置 a と b の距離が奇数の場合に限られます。 ACコード: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 void process() { 5 long long n, p, q; 6 cin >> n >> p >> q; 7 if ((abs(p - q) % 2) ...

7月24日 17:10 投稿

動的計画法:完全背包問題の主要パターンと実装ガイド

完全背包問題の基本概念 動的計画法(DP)における完全背包問題(Complete Knapsack Problem)は、各アイテムを無限に選択可能な状態での最適化問題を指します。0-1 背包問題との主な違いは、アイテムの再利用が許可されている点であり、これにより状態遷移の内側ループ順序が重要になります。具体的には、背包の容量を小さい方から大きい方へ順に更新することで、同一ア ...

7月23日 17:01 投稿

Codeforces Round 1027 (Div. 3) 問題解説(A〜E)

概要 本稿では、Codeforces Round 1027(Div. 3)の問題AからEまでの解法を示す。 問題A:数値構築 問題内容 4桁の整数cが与えられる。整数a(0以上99以下)とb(0以上99以下)を用いて、(a+b)² = c を成立させられるか判定する。 解法 0から√nまでの範囲で遍历し、平方数になるかを判定すればよい。a+b = √c が成立する必要があり、a=0, b=√c で試すだけで十分である ...

7月19日 20:01 投稿

アルゴリズム問題の効率的な解法

本記事では、複数のアルゴリズム問題について考察し、それぞれの問題に対する効率的な解法を説明します。 避難所配置問題 この問題は、特定の範囲内で最も効率的な方法で避難所を配置する必要がある。具体的には、以下の関数を考える: [ g(y, r) ] は、右境界が (r) の場合に、位置 (y) に避難所を設置したときのコストを表す。 我々が必要とするのは、[ \max_{j \geq mid ...

7月18日 01:21 投稿

JOI 2013 国内予選最終ラウンド解説

問題1:交互配列の最長連結区間 与えられた 0-1 列において、隣接要素が交互に変化する(例:01010)最大長の連続部分列を求める。ただし、1つの「交互セグメント」を反転することで、より長い連続交互列を得られる可能性がある。 まず、入力列を交互性に基づいて分割し、各セグメントの左右端点を記録。その後、隣接する3つのセグメント(左・中・右)を結合した長さを評 ...

7月14日 01:06 投稿

模擬退火アルゴリズムの原理と実装事例

模擬退火法の概要 模擬退火(Simulated Annealing, SA)は、大域的最適解近似アルゴリズムの一種であり、組み合わせ最適化問題などに広く適用される確率的探索手法です。解空間が非常に広大であり、かつ目的関数が単峰性を持たない場合などに有効です。 この手法は、金属加工における「焼きなまし(Annealing)」プロセスに由来します。金属を高温で加熱し、徐々に冷却する ...

7月12日 23:28 投稿

フェニック木(Binary Indexed Tree)の基礎と応用

フェニック木(Binary Indexed Tree, BIT)は、主に数列の prefix sum(接頭辞和)を効率的に管理・計算するために設計されたデータ構造です。セグメント木と比較して実装が簡潔であり、定数倍の計算コストが低いため、頻繁な更新とクエリが発生する箇所で広く利用されています。本記事では、基本的な1次元の構造から、差分を利用した区間更新、および2次元への拡張につい ...

7月11日 16:07 投稿