2022 ICPC アジア西安地区大会 問題解説と実装アプローチ
C. Clone Ranran
本問題は、自身のクローンを作成する時間と、問題を作成する時間のバランスを取って最小の総時間を求めるものです。
クローンを作成する回数を全探索します。クローンを作成するたびに人数は2倍になるため、対数オーダーの探索で済みます。各ステップにおいて、必要な問題数を現在の人数で割ったもの(切り上げ)を作成時間に乗算し、クローン作成時間と合 ...
8月18日 14:40 投稿
Javaにおける配列の基本操作とメモリ管理
配列の概念と特性
配列(Array)は、同一データ型の複数の値を格納するためのコンテナです。データ格納時には暗黙的な型変換を考慮する必要があります。
配列の宣言方法
形式1:データ型[] 配列名
int[] numbers;
形式2:データ型 配列名[]
int numbers[];
静的初期化
int[] numbers = new int[]{10, 20, 30, 40};
// 簡略化形式
int[] values = {15, 25, 35, 45};
動的 ...
8月17日 11:15 投稿
C++における責任連鎖パターンの高度な応用
1. 要素を変更しないアルゴリズム
コンテナ内の要素を変更しない操作を提供します。
1.1 find と find_if
find(start, end, value): 指定値と等しい最初の要素を検索
find_if(start, end, predicate): 条件を満たす最初の要素を検索
find_end(start, end, sub_start, sub_end): 部分列の最終出現位置を検索
#include <vector>
#include <iostream>
int m ...
8月15日 18:16 投稿
2数和問題の最適解法と3数和への拡張
問題概要
配列内の2つの要素を選択し、その和が指定された値に一致する組み合わせを高速に見つける。配列は少なくとも1組の解を持つことが保証されている。
例:配列 [5, 6, 1, 4, 7, 8, 9]、目標値 10
解法1:全探索(二重ループ)
すべてのペアを試す方法。時間計算量は O(N²) であり、効率が低い。
<pre>
#include <iostream>
using namespace std;
v ...
8月14日 02:39 投稿
C言語における構造体とポインタを活用したデータ管理および連結リスト実装
構造体配列による学生成績の管理とソート処理
C言語におけるデータ集約処理では、複数の関連する変数をまとめる構造体(struct)が不可欠です。以下の実装では、学生の成績データを構造体配列で管理し、評価の算出、不合格者のフィルタリング、および成績順のソート処理を行っています。ソートアルゴリズムには、要素の交換を補助関数に分離したバブルソートを適用し、コー ...
8月13日 16:49 投稿
カスタムアロケータの実践的な活用
1、変更しないシーケンスアルゴリズム
これらのアルゴリズムは、操作対象のコンテナ内の要素を変更しません。
1.1 find と find_if
find(開始イテレータ, 終了イテレータ, 値):指定された値に一致する最初の要素を検索し、イテレータを返します(見つからない場合は終了イテレータを返します)。
find_if(開始イテレータ, 終了イテレータ, 条件関数):条件関数を満たす最 ...
8月13日 16:22 投稿
2026年NOI問題解決記録(十五)
コンテストリンク
\(\text{著者:DaiRuiChen007}\)
A. [UOJ702] 張飛の精鋭兵団 (3.5)
問題リンク
コンテストの過程を木として捉え、値を大きい順に埋めていく。制約は親子のトポロジカル順序であり、係数が\(-1\)の層を優先的に埋める。もし埋められない場合は、子ノードが最も多く、勝利回数が最も多いノードを選ぶ。
コードに落とし込むと複雑度を効率的に改善できる。
...
8月12日 06:48 投稿
アルゴリズム解説:組合せ数学、基環木DP、および数論篩の実装
問題1:グリッド経路の組み合わせと寄与計算
本問はグリッド上の経路数と各初期値が最終結果に与える寄与度を計算する問題です。始点から終点 $(N, M)$ への移動において、右と上のみ移動可能と仮定します。各地点 $(i, j)$ から $(N, M)$ への移動経路の総数は、右への移動回数と上への移動回数の組み合わせにより $\frac{(N-i + M-j)!}{(N-i)! (M-j)!}$ で求められます。 ...
8月11日 17:39 投稿
プログラミングコンテスト模擬試験問題集
1. 約数の個数
2. 最大部分行列問題
総当たり法による解法
#include <iostream>
using namespace std;
// 部分行列の合計を計算
int grid[40][30];
long long maxSum;
int main() {
// 30x20のグリッドを読み込む
for(int row = 1; row <= 30; row++) {
for(int col = 1; col <= 20; col++) {
cin >> grid[row][col];
...
8月10日 22:56 投稿
Javaアルゴリズム実践:コレクション操作とデータ構造
コレクション操作ユーティリティ
ArraysとCollectionsクラスの主要メソッド:
asList:リスト変換には戻り値が必要
copyOfRange:配列の部分コピー
型変換テクニック
// List<Integer> → int[]
public int[] convert(List<Integer> list) {
return list.stream()
.mapToInt(Integer::intValue)
.toArray();
}
Stream ...
8月10日 13:21 投稿