Windows 7 64bitでのVisual Studio 2005+OpenCV+Boost開発環境

Windows x64での開発環境を整える必要があったのでメモ。

  • Windows 7 64bit (XPがなかった…)
  • Visual Studio 2005 Professional Edition
  • OpenCV 2.1
  • Boost 1.43

Visual Studio 2005 インストール
デフォルトだと x64 関係のツールだけチェックが外れているのでカスタムインストールorフルインストールする。いきなりこれで躓いていたのは秘密。
Visual Studio 64 ビット コンポーネントのインストール | Microsoft Docs

Visual C++ には、x64 用のコンパイラ、Windows 64 ビット コンピューター用のツール、および 64 ビット ランタイム .dll (msvcr80.dll、msvcm80.dll、msvcp80.dll など) のインストール オプションが用意されています。これらのコンポーネントをインストールするには、完全インストールを実行するか、カスタム インストール中に [x64 コンパイラおよびツール] チェック ボックスをオンにします。

Visual Studio 2005 Service Pack 1 インストール。
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2005/sp1/

Visual Studio 2005 Service Pack 1 Update for Windows Vista インストール。
名前はfor VistaだけどWindows 7も対応。
Download Visual Studio 2005 Service Pack 1 Update for Windows Vista from Official Microsoft Download Center


Boost インストール
Visual Studio 2005 x64 Cross Tools Command Prompt から
> bootstrap.bat
> bjam address-model=64 --build-type=complete
デフォルトだとマルチスレッド版スタティックライブラリがなかったので全部ビルド。
かなり時間がかかるので、ちゃんと必要な分だけオプションで指定すべきかな…
c++ - How do you build the x64 Boost libraries on Windows? - Stack Overflow
http://www.yoshibaworks.com/ayacy/inasoft/talk/h200704a.html


OpenCV2.1 インストール
基本的に下記の記事に載っている手順そのまま。
OpenCV 2.0 入手、ダウンロード、インストール、環境設定 画像処理ソリューション
CMake で Configureするときは、Visual Studio 2005 x64 を選択。
VC8 だと対応していないSSE3関係でエラーがでる。
cvinternal.h の
#if defined __SSE3__ || _MSC_VER >= 1400 を
_MSC_VER >= 1500 に変更して対応。
OpenCV 2.1/SIMD SSE Visual Studio2005コンパイルエラー対策: きじばと日記

うーん諸悪は Visual Studio 2005 を使っているところにある気がしてきた。

TopCoder初め

時々キーワードとしては見かけていたTopCoder。
自分とは関係ないと思っていたけど、始めてみる。
ついでにはてなダイアリーも。
主にコーディング: TopCoderの登録方法 (2011/07/14更新)
nodchip's website | nodchipの作成したフリーソフトを公開しています

諸事情としては、しばらく離れていたプログラミングを最近結構な割合でやるようになり、
純粋に面白くなってきたのと、どうせなら自分がこっちの方面で適性があるのか見てみたくなった。

はてなダイアリーの練習(笑)もかねて第一回練習記念にソースを貼ってみる。
他の人の回答も見れるようなのでこれから見てこよう。
ちなみにヘッダとかstd::が抜けて何度も部屋でyu4uがコンパイルしていますという
ログを流しているのに気付かなかった。恥ずかしすぎるw

SRM 476 DVI2 500点問題

#include <vector>
#include <algorithm>

class Badgers {
public:
	int feedMost(const std::vector<int>& hunger, const std::vector<int>& greed, const int food) {
		int num = hunger.size();
		std::vector<int> sum(num);
		int i;
		for (i = 1; ; i++) {
			for (int j = 0; j < num; j++) {
				sum[j] = hunger[j] + (i - 1) * greed[j];
			}
			sort(sum.begin(), sum.end());
			int sumfood = 0;
			for (int j = 0; j < i; j++) {
				sumfood += sum[j];
			}
			if (sumfood > food) {
				break;
			}
		}
		return(i - 1);
	}
};