GoogleCodeJamJapan予選

参加しました.
13時開始で,14時頃に外出しなければなかったという事件(参加登録してから気づいた)

問題はABCの3種類,それぞれにSmallとLargeという2つの制約があり,愚直に書くとSmallは解けるがLargeは一捻りいる感じ.
ただし,Largeはコンテストが終わるまで正解か分からない.
3問中1問でもLargeが解ければ決勝に出場出来るらしい.


気づくと13時15分になってたので慌てて参加.
Aを見て問題を理解するも,Largeが解ける解法を思いつかなかったのでパス.
Cを開く,問題理解
数字Nが与えられ,a+b=Nを満たすa,bの1のビット数が最大となるとき1のビット数を答える問題.
紙の上で1から6まで解答してみる.
全てのビットが1の数(2^n-1)のうち,N以下で最大の物と,残り.で解けそうな気がする.
サンプルのケースで実験も出来るだろうという甘い考えの元,ダラダラと書く.

#include <iostream>
using namespace std;
typedef unsigned long long uint;

int bitCount(uint x){
    int count = 0;
    for(uint mask = 1; mask != 0; mask <<= 1) {
        if( (x & mask) != 0 ) count += 1;
    }
    return count;
}

int main(){
	uint n,t;
	cin >> t;
	for(int i=0;i<t;++i){
		cin >> n ;
		uint k=0,j;
		while( ( n > (((uint)1<<(++k))-1) ) );
		k-=1;
		n -= (((uint)1<<k)-1);
		k += bitCount(n);
		cout << "Case #" << i+1 << ": " << k << endl;
	}
}

1のビット数を数えるのにstd::bitsetが使えそうなのは知ってたけど,使った事なかったのでヤメ.
「ビット数 数える C言語」とかいうナメたワードでググッて見つけたソースをコピペしてちょいちょいと書き換えた.
サンプル合った.
Small正解.
Large提出.

この時点で14時前だったので,Aを愚直に書いてみたりしたがサンプル合うのにSmall通らなくて涙目.
時間過ぎてたのでしぶしぶと外出.


後々確認してみるとC-Large通ってたようで良かった.
542位という素晴らしい成績で決勝進出のようです.

Tシャツ欲しいよ!