競技プログラミング練習問題集:基礎アルゴリズムと実装の解説
幾何学的面積計算問題
解法の指針
指定された矩形領域内で、頂点座標から特定の三角形と台形の面積を減算して目的の面積を求めます。
#include <iostream>
using namespace std;
int calculate_shaded_area(int x, int y) {
const int total_area = 5000;
int triangle_area = (100 - x) * 25;
int trapezoid_area = y * 25;
return total_area - t ...
7月15日 16:05 投稿
木の直径を求める2つの主要アプローチ
木の直径(Tree Diameter)とは、木構造グラフにおいて最も離れた2つのノード間の距離を指します。この計算には、主に深さ優先探索(DFS)を2回行う方法と、動的計画法(DP)を用いる方法の2つが広く知られています。本記事では、それぞれのアルゴリズムの原理と実装手法について解説します。
DFSによる2回の探索アプローチ
この手法は非常に直感的で、計算量も効率的です ...
7月14日 23:27 投稿
逆順リストによる整数の加算
二つの非空連結リストが与えられます。各リストは非負整数を逆順で表現し、各ノードは一桁の数字を保持します。二つの数を加算し、同じ形式で結果を返してください。両数値は先頭が0でないことが保証されます。
解法の要点
桁ごとの加算と繰り上がりの処理
仮想ヘッドノードによる実装の簡略化
異なる長さのリストへの対応
#include <iostream>
struct Node {
...
7月14日 21:39 投稿
データ構造におけるスキップリスト
スキップリスト(Skip List)は確率的なデータ構造であり、標準の順序付きリストに複数のインデックス層を追加することで、高速な検索、挿入、削除操作を実現します。この構造は平衡木と同等の効率を持つことができ、各操作の時間計算量はO(log n)です。また、その実装が比較的シンプルであるという利点があります。
スキップリストの主要特徴
マルチレベル構造:スキップ ...
7月14日 20:00 投稿
Javaにおけるアルゴリズム最適化と計算量解析
1. アルゴリズム最適化の重要性
Java開発においてアルゴリズムの最適化は極めて重要です。効率的なアルゴリズムはプログラムの実行速度を向上させるだけでなく、リソース消費を削減し、ユーザー体験を向上させます。最適化には時間計算量と空間計算量の両方を考慮する必要があります。
2. 時間計算量
時間計算量は入力サイズに対するアルゴリズムの実行時間の増加率を ...
7月14日 16:57 投稿
OI入門:基本文法とアルゴリズムの基礎
第一章:環境構築から始めよう
プログラミングを始める前に、まず開発環境を整える必要があります。OI(情報学オリンピック)では、Dev-C++、Code::Blocks、VS CodeなどのIDEが一般的です。初心者はDev-C++から始めることをおすすめします。軽量で設定も簡単なため、初心者には適しています。
1.1 Dev-C++のインストール手順
「Dev-C++」を検索し、公式サイトを確認してく ...
7月14日 03:29 投稿
C言語における配列操作の実験
実験課題1
ソースコード
1 #include <stdio.h>
2 #define SIZE 4
3 #define ROWS 2
4
5 void demonstrate_1d_array() {
6 int data[SIZE] = {1, 9, 8, 4};
7 int index;
8
9 printf("sizeof(data) = %d\n", sizeof(data));
10
11 for (index = 0; index < SIZE; ++index)
12 printf("%p: %d\n" ...
7月13日 21:07 投稿
Pythonによるアルゴリズム実装入門
基礎構文とデータ構造
1. 変数と基本操作
Two Sum(二数の和)
# アプローチ1:全探索
class Solution:
def twoSum(self, nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
# アプローチ2:ハッシュマップ
class Solution: ...
7月13日 00:57 投稿
SMU 2024年秋期 第1回個人戦 解説
A. 辞書順最小文字列生成
解法概要
2つの文字列を降順にソートし、交互に文字を取り出す。同じ文字列から連続して取り出す回数が制限値kを超えないようにしながら、最終的に辞書順が最小になるように構築する。
変更版コード例
#include <iostream>
#include <algorithm>
using namespace std;
void process() {
int lenA, lenB, maxSame;
cin >> le ...
7月12日 19:03 投稿
文字変換とアルゴリズム問題集
文字変換問題
Ytfcは魔法の森で、文字列の大文字小文字を反転させる必要がある。この問題を解決するプログラムを作成せよ。
入力:
複数の文字列が与えられる。各文字列の長さは1から200の間である。
出力:
各文字列に対して、大文字小文字を反転させた結果を出力する。
#include<stdio.h>
char str[205];
int main(){
while(scanf("%s",str)!=EOF){
...
7月12日 18:31 投稿