POJ 2453

#include <iostream>
using namespace std;

int countBits(int n) {
	int count=0;
	//MSBから順に,立っているかチェック
	for (unsigned int mask=0x80000000; mask>0; mask>>=1) {
		if (mask & n) count++;
	}
	return count;
}

int main() {
	int n;
	while (true) {
		cin >> n;
		if (n == 0) break;
		int cn = countBits(n);
		do {
			n++;
		} while (countBits(n) != cn);
		cout << n << endl;
	}
	return 0;
}

間違えたポイント

演算子の優先順位

if (mask & n > 0)
って書くと,if (mask & (n > 0))と解釈される?みたいではまった.

maskの最大値

(0 <= I <= 1000000)だから,32ビット全部やらなくていいか〜とおもってmask=0x80000(20ビット目)から始めてしまった.本当はI=1000000のときJは20ビット以上になる可能性があるので,これではダメ.結局32ビットやるようにした.

maskのビット数

unsigned intにしないと32ビット丸々使えない.

POJ 1046

#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
	int r[16],g[16],b[16];
	for (int i=0; i<16; i++) {
		cin >> r[i] >> g[i] >> b[i];
	}
	int rr,gg,bb;
	while (cin >> rr >> gg >> bb) {
		if (rr==-1 && gg==-1 && bb==-1) break;
		int d2,mind2=256*256*256,mini=0;
		for (int i=0;i<16;i++) {
			d2 = ((r[i]-rr)*(r[i]-rr)+(g[i]-gg)*(g[i]-gg)+(b[i]-bb)*(b[i]-bb));
			if (d2<mind2) {mind2=d2;mini=i;}
		}
		printf("(%d,%d,%d) maps to (%d,%d,%d)\n", rr,gg,bb,r[mini],g[mini],b[mini]);
	}
	return 0;
}

最小のユークリッド距離を求める.
最小値さえ分かればよいので,平方根をとる必要はない.
特につまったところはなかった.

Effective Java 第2版

改訂によってJava1.6が対象となりました.
以下が追加されました.

なんだか日本語訳がおかしい感じがしますが(英語直訳っぽい),時間を見つけて読み進めていきたいと思います.

SRM 144 DIV2 250

class Time {
	public String whatTime(int seconds) {
		int h = seconds / 3600;
		seconds = seconds % 3600;
		int m = seconds / 60;
		seconds = seconds % 60;
		return h + ":" + m + ":" + seconds;
	}
}

Practice Roomで練習してみました.
クラスはpublicにしないとエラーが出るのね.

POJ 1028

#include <iostream>
#include <vector>
using namespace std;
int main(){
	vector<string> urls;
	urls.push_back("http://www.acm.org/");
	int idx = 0;
	string cmd;
	while (true) {
		cin >> cmd;
		if (cmd == "QUIT") return 0;
		else if (cmd == "VISIT") {
			for (int i=urls.size()-1; i>idx; i--) {
				urls.pop_back();
			}
			string url;
			cin >> url;
			urls.push_back(url);
			idx++;
		}
		else if (cmd == "BACK"){
			if (idx <= 0) {
				cout << "Ignored" << endl;
				continue;
			}
			idx--;
		}
		else if (cmd == "FORWARD") {
			if (idx >= urls.size()-1) {
				cout << "Ignored" << endl;
				continue;
			}
			idx++;
		}
		cout << urls[idx] << endl;
	}
	return 0;
}