2011-06-01から1ヶ月間の記事一覧

TCO11 Round1 Medium(500) MuddyRoad

MuddyRoad.MMMMM.という部分があるとMの個数をmとして、⌊m/2⌋回泥を踏む。それぞれの区間について、.MMMMM.の形になる確率を求めて足し合わせる。 #include <vector> using namespace std; class MuddyRoad{public: double getExpectedValue( vector <int> road ) { int n</int></vector>…

TCO11 Round1 Easy(250) TripleStrings

TripleStringsinit[k..n-1] == goal[0..n-k-1] ならば、init[0..k-1]のうちoをBにxをCに振り分けることで、2kでgoalにできる。oxxox → ooxxo のように答えが2nになる場合もある。 #include <string> using namespace std; class TripleStrings{public: int getMinimu</string>…

TCO11 Round1

Easy (250) 0 (Challenge Succeed) Medium (500) 318.72 Hard (1000) 0 Challenge 0 結果 1773 → 1773621位なので、たぶん通過。焦って250を落としたのが勿体ない。

SRM509 Div2 Hard(1000) NumberLabyrinthDiv2

NumberLabyrinthDiv2ある空のセルを2回通る動きが最善になることはないので、高々K回空のセルを通りその時は好きな距離を飛べると考えても答えは同じ。スタート地点からそれぞれの地点にあとk回飛べる状態でたどり着く最短手数を幅優先探索で求める。 #incl…

SRM509 Div1 Medium(500) PalindromizationDiv1

PalindromizationDiv1文字列を回文にする編集回数は、文字列を2つに分けて左側と右側をひっくり返したものの編集距離を求めれば良い。左側に文字aが、右側にbがあるとき、一致させるためには、aからもbからも変換可能なある文字cがあれば良い。追加も消去も…

SRM509 Div2 Easy(250) PalindromizationDiv2

PalindromizationDiv2 int rev( int x ) { int r = 0; int t = x; for ( int i=1; t>0; i*=10 ) r = r*10 + t%10, t /= 10; return r; } class PalindromizationDiv2{public: int getMinimumCost( int X ) { for ( int i=0; ; i++ ) if ( X+i == rev(X+i) ||…

SRM509 Div1 Easy(250), Div2 Medium(500) LuckyRemainder

LuckyRemainder整数xを9で割った余りは、xの各桁の和を9で割った余りに等しい。Xの桁数をnとすると、全ての桁は2n-1回足される。 #include <string> using namespace std; class LuckyRemainder{public: int getLuckyRemainder( string X ) { int n = (int)X.length(</string>…

SRM509

Easy (250) 237.68 Medium (500) 0 (Challenge succeed) Hard (1000) 0 Challenge 0 結果 1747 → 1773落ちるかと思ったけど、レーティング上がった。

SRM508 Div2 Hard(1000) YetAnotherORProblem2

YetAnotherORProblem2Div1の問題よりサイズが小さいので簡単。各桁でビットが立っているのがA0,A1,……,AN-1のうち高々1個であれば良い。k&=jは(j|k)==jとなるようなjを列挙するため。参照。単純に0≦k≦Rでループすると惜しいところでTLEだった。 class YetAnot…

SRM508 Div2 Easy(250) CandyShop

CandyShop #include <vector> using namespace std; class CandyShop{public: int countProbablePlaces( vector <int> X, vector <int> Y, vector <int> R ) { int n = (int)X.size(); int c = 0; for ( int x=-200; x<=200; x++ ) for ( int y=-200; y<=200; y++ ) { bool f = true</int></int></int></vector>…

SRM508 Div1 Medium(500) YetAnotherORProblem

YetAnotherORProblem論理和と和が等しくなるのは、2進数でi桁目が1であるAxの個数が高々1個の場合。各桁ごとにAxのどれか1個に1を割り振るか、全てを0にする、場合の数を考える。Aiのj桁目に値を割り振る時、Ai≦R[i]を満たすためには、R[i]のj桁目が1ならば0…

SRM508 Div1 Easy(250), Div2 Medium(500) DivideAndShift

DivideAndShiftシフトはいつ行っても良い。Nの約数wについて幅をwにしてからシフトを行うとすると、幅をwにするためにN/wの素因数の個数の回数分割が必要で、シフトにmin((M+w-1)%w,w-(M+w-1)%w)回かかる。 #include <algorithm> using namespace std; class DivideAndS</algorithm>…

SRM508

Easy (250) 0 Medium (500) 0 Hard (1000) 0 Challenge -25 結果 1927 → 1747初マイナス点。これは痛いorz