挿入ソートの原理と実装
挿入ソート(Insertion Sort)は、配列を部分的に整列させながら全体をソートしていくアルゴリズムである。既に整列された部分に対して、次の要素を適切な位置に挿入することで、徐々に整列範囲を広げていく。
アルゴリズムの流れ
最初の要素を「整列済み」とみなす。
次の要素を取り出し、整列済み部分の末尾から先頭に向かって比較を行う。
取り出した要素が比較 ...
5月19日 20:41 投稿
ABC347 プログラミングコンテスト問題解説
A
link
很简单
配列を順にアクセスし、\(k\)で割った余りが\(0\)かどうか判定する。余りが\(0\)の場合、\(a_i/k\)を出力する。
クリックしてコードを表示```
#include<bits/stdc++.h>
using namespace std;
int n, k;
int data[105];
int main() {
cin >> n >> k;
for(int i = 1; i <= n; ++i) {
cin >> data[i];
if(data[i] % k == 0) ...
5月19日 18:09 投稿
LeetCode 2960: テスト済みデバイスのカウント問題
長さn、0から始まるインデックスを持つ整数配列batteryPercentagesが与えられ、これはn個のデバイスのバッテリー百分比を表します。
あなたのタスクは、各デバイスiを順番にテストし、以下のテスト操作を実行することです:
もしbatteryPercentages[i]が0より大きい場合:
テスト済みデバイスのカウントを増やす。
インデックスが[i + 1, n - 1]のすべてのデバイスのバッテ ...
5月19日 14:13 投稿
アルゴリズム実装と最適化テクニック
問題B:完全立方数を避ける数列選択
数列 $\{a_n\}$ から部分集合を選び、任意の2要素の積が完全立方数とならないようにする。$n\le 10^5$、$1\le a_i\le 10^{10}$。
重要な観察:$10^5$ より大きい素因数を持つ数は常に解答に寄与する。その他の数については、非1の完全立方因子をすべて除去してから処理する。
ll factorizeRandom(ll val) {
if (val % 2 == 0) re ...
5月19日 12:29 投稿
スタックとキューの実装:データ構造の変換問題
基礎知識
スタックとキューの内部実装メカニズム
キューは先入れ先出し(FIFO)、スタックは後入れ先出し(LIFO)です。
スタックに関する4つの基本質問
C++におけるstackはコンテナですか?
スタックとキューはSTL(C++標準ライブラリ)の2つのデータ構造です。STLでは、スタックはコンテナとして分類されるのではなく、container adapter(コンテナアダプタ) ...
5月19日 11:09 投稿
二分木の基本問題と解法
一、100. 同じ木の判定
1. 問題概要
二つの二分木の根ノード p と q が与えられたとき、これらの木が同じであるかどうかを検証する関数を記述してください。
2つの木が構造的に同じで、かつノードの値が同じである場合、それらは同じであると見なされます。
2. コード
class BinaryTreeChecker {
public boolean areTreesIdentical(TreeNode node1, TreeNode node2) ...
5月19日 10:29 投稿
トライ木:効率的な文字列検索と接頭辞マッチングのためのデータ構造
トライ木(Trie)は、辞書木や接頭辞木とも呼ばれるデータ構造で、特定の文字列が存在するかどうかの検索や、特定の接頭辞を持つ文字列の数を効率的に数えるために使用されます。
トライ木は接頭辞の概念を利用しており、各文字列を一文字ずつ分解して木構造のノードに格納します。例えば、"cup", "apple", "cake", "app", "blog" という単語がある場合、以下のような木構 ...
5月19日 06:24 投稿
Kruskal再構築木の学習メモ
前提知識
Kruskal最小/最大全域木アルゴリズム、ダブリング(Binary Lifting)の知識を前提とします。
Kruskal再構築木を構築すると、最小全域木上の2点間のパスの最大重み、および重み ≤ w の辺のみを通って到達可能な点の集合を O(log N) で求めることができます。
近年の競技プログラミングでは出題頻度は控えめですが、該当する問題に遭遇した際に非常に強力なツ ...
5月19日 05:15 投稿
C言語の基礎演習問題
1.整数の階乗を計算する。
#include<stdio.h>
int main()
{
int i =1;
int n=0;
int ret=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
ret=ret*i;
}
printf("%d",ret);
return 0;
}
2.1!+2!+3!+4!+5!+6!+...+10!の和を求める。
#include<stdio.h>
int main()
{
int i =1;
int n=0;
int j=1;
for(j=1;j<=10;j ...
5月19日 00:14 投稿
Codeforces Round 895 (Div. 3) 解法概要
CF1872B 通路の限界
問題概要
一列に並んだ部屋のうち、いくつかには罠があります。各罠のある部屋には、到達可能な時間の制限があります。プレイヤーは1番目の部屋から最大で何番目の部屋まで往復できるかを求めます。
解法
各罠部屋の到達可能な最大位置を計算します。この位置は、罠の発生時間の半分を基準に計算されます。すべての罠部屋を距離順にソートし、途中で到 ...
5月18日 19:20 投稿