思い立ったが吉日
久しぶりにブログを更新しようと思い至ることになった。
そもそも、なんで数年に渡って更新をしなかったのかといえばきっと虚しくなったのだろうと思う。
ブログを始める切っ掛けになった人と疎遠になり、プログラミングをしたいと思えども仕事では録にさせてもらえず、さりとてただ趣味でプログラミングをするだけでは満足できないのだ。。。
きっと、プログラミングを通じて誰かの役に立ちたいという欲求が根本にあったのだろうと思う。
ブログを再開することになった切っ掛けは退職を決意したことが大きい。
退職をするうえで生き方を再考する機会を得て、人生の目的を遂行する上でブログの再開が必要という結論に達したのだ。
私はやはりプログラミングが好きで、プログラミングをし続けて人生を終えたいのだ。そして、実のところ文章を書くのも嫌いではない。誰にも評価されない駄文を書き殴るのは大好きだ。今度は誰かのためではなく自分の目的のためにプログラミングを行い、文章を書き、ブログを更新する。
他人軸から自分軸への移行である。
アクティビティ選択
さて、せっかく再開したのだから何かしら有益そうな情報を投稿して人の役に立ちたいものだ。
Kindleで「競技プログラミングのためのC++」という書籍を購入したのだが、正直なところ購入はお勧めしない。機械翻訳で読みづらいうえ、コードまで変な翻訳がされているため非常に読みづらい。もし英語版があるなら英語版を買う方がマシだろう。その中から最適化問題で使用される貪欲法のアルゴリズムの一つであるアクティビティ選択のコードを解析したので下記に記しておく。(内容が合っているかは保証しない)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Activity {
int start, finish;
};
bool compare(Activity a, Activity b)
{
return a.finish < b.finish; // 終了時間でソート
}
void selectActivity(vector<Activity>& activities)
{
sort(activities.begin(), activities.end(), compare); // 終了時間で並べ替え
cout << "選択されたアクティビティ:\n";
int lastSelected = 0; // 最初のアクティビティを選択する
cout << "アクティビティ: " << lastSelected + 1 << " (開始: " <<
activities[lastSelected].start << "、終了: " <<
activities[lastSelected].finish << ")\n";
for (int i = 1; i < activities.size(); ++i)
{
if (activities[i].start >= activities[lastSelected].finish)
{
cout << "アクティビティ: " << i + 1 << " (開始: " <<
activities[i].start << "、終了: " << activities[i].finish << ")\n";
lastSelected = i;
}
}
}
int main()
{
vector<Activity> activities = { {1, 3}, {2, 5}, {4, 7}, {6, 8}, {5, 9} };
selectActivity(activities);
return 0;
}