競プロ典型問題の解法パターンと実装テクニック
文字列の構成要素検証
与えられた3文字の文字列が"A"、"B"、"C"の3種類の文字のみで構成されているかを判定する問題。文字の順序は問わず、各文字が1回ずつ出現するかを確認する必要がある。
#include <iostream>
#include <array>
using namespace std;
int main() {
string input;
cin >> input;
array<int, 3> count = {0};
...
8月27日 22:31 投稿
AtCoder ABC369 のアルゴリズム解説
A. 369
整数 $C$ が存在して $A, B, C$ が等差数列となる条件は、$A+B$ が偶数であることです($C = (A+B)/2$ が整数であることと同値)。特別な場合として、$A=B$ であれば数列の長さは1となるため、答えは1です。それ以外の場合、$A+B$ が偶数ならば $A$ と $B$ の間に整数が1つ、$A$ と $B$ の外側に整数が1つずつ存在するため、選択肢は3つになります。奇数の場合は $A ...
8月22日 09:01 投稿
AtCoder ABC336 演習:桁制約付き DP と双方向 BFS
E - 数字の和で割り切れる数
この問題では、与えられた正整数 \(N\) 以下の自然数のうち、その桁の和で割った余りが 0 となる数を求める必要があります。
通常の桁 DP では、剰余を状態として維持するのは容易ですが、今回のように「剰元の基準(桁の和)」自体が変化する場合、直接的な DP では困難になります。そこで、桁の和(モジュロ)を先に見積もるアプローチを取 ...
8月13日 02:59 投稿
2024年夏休み交流戦・練習編1
2024年夏休み交流戦・練習編1
A - 🐓
AtCoder - abc079_d
問題文
各頂点のコストが与えられ、それを1に変換するのに必要な最小コストを求める。
解法
すべての数を1にするには、直接1に変換するか、別の数に変換してからさらに変換する方法がある。
これは$floyd$アルゴリズムによる最短経路探索と似ているため、$floyd$を適用できる。
コード
#include<bits/stdc++.h&g ...
8月5日 02:59 投稿
HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)解説
A - Yay!
長さが3以上の文字列中に2種類の文字が含まれており、そのうち1つはちょうど1回だけ出現する。その位置を1-indexedで出力せよ。
最初の文字が一意であれば、残りにその文字は存在しない。そうでなければ、最初の文字とは異なる最初の文字を探せばよい。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
...
7月18日 00:29 投稿
AtCoderコンテスト445の解法解説
D - チョコレートの再構築
この問題は比較的単純な実装問題です。チョコレートの配置を再構築するアルゴリズムを示します。
struct Chocolate {
int height;
int width;
int id;
};
bool compareWidth(const Chocolate &a, const Chocolate &b) {
return a.width > b.width;
}
bool compareHeight(const Chocolate &a, const Chocolate &b) {
ret ...
7月17日 20:13 投稿
ABC356コンテスト問題解説
問題A
問題の指示に従ってシミュレーションを行います。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int size, left, right;
cin >> size >> left >> right;
vector<int> sequence(size);
for (int i = 0; i < size; ++i) {
sequence[i] = i + 1;
} ...
7月17日 03:05 投稿
ABC351コンテスト問題解説
問題A: ゲームの点数計算
木青チームと高橋チームの点数をそれぞれ計算し、木青チームの総得点が高橋チームより1点多くなるようにします。
コード例
#include <iostream>
#include <vector>
int main() {
int score_gq = 0, score_mq = 0;
int input;
// 木青チームの9つの点数を入力
for (int i = 0; i < 9; ++i) {
std::cin >> i ...
7月14日 02:44 投稿
ビット列列挙の応用問題集
ビット列列挙は、組み合わせ問題を効率的に解決するための強力な手法です。具体的な応用例を通じてその実装方法を解説します。
問題1: ビットマスクとPopcountの総和
与えられた非負整数NとMについて、0からNまでの全ての整数iにおける (i & M) のビットカウント(popcount)の総和を求める。解法では加算処理を乗算に変換して効率化する。
例: N=22 (2進数:10110) ...
7月11日 21:10 投稿
AtCoder Beginner Contest 338 解説
A - Capitalized?
英字からなる文字列 $S$ が与えられる。先頭が大文字で、残りがすべて小文字であるかを判定する。
単純に先頭文字が 'A'~'Z' の範囲にあり、他の文字がすべて 'a'~'z' の範囲にあるかをチェックすればよい。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
bool ok = isupper(s[0]);
for (in ...
7月8日 19:49 投稿