2011-01-01から1年間の記事一覧

SRM528

Easy (250) 169.87 Medium (500) 0 Hard (1000) 0 Challenge +50 -25 結果 390位 2085→2007( ´ ・ ω ・ ` )

SRM526 Div2 Hard(1000) SumOfLuckiness

SumOfLuckinesslucky(x)を0からxまでのluckinessの合計とすると、答えはlucky(B)-lucky(A-1)。まずは、iとjそれぞれについて、i桁以下で(4の個数)-(7の個数)=jとなる整数の個数T[i][j]を動的計画法で求める。例えば、x=526とすると、0-99, 100-199, 200-299,…

SRM525 Div2 Hard(950) MagicalSquare

MagicalSquareS[0][0], S[0][1], S[1][0], S[1][1]を決めれば、残りのマスも定まる。事前にrowStrings, columnStringsのそれぞれの位置からの最長一致長を求めて高速化する。 #include <string> #include <vector> using namespace std; class MagicalSquare{public: long lo</vector></string>…

SRM526 Div2 Easy(250) CheatingQuiz

CheatingQuiz #include <string> #include <set> #include <vector> using namespace std; class CheatingQuiz{public: vector <int> howMany( string answers ) { vector<int> ans; for ( int i=0; i<(int)answers.length(); i++ ) ans.push_back(set<char>(answers.begin()+i,answers.end()).siz</char></int></int></vector></set></string>…

SRM526 Div1 Medium(500) PrimeCompositeGame

PrimeCompositeGameK=1の場合はシミュレートする。K>=2のとき、2個の素数の間にKより大きな隙間があると、そこに追い込まれて私が負ける。それ以外の場合は2を取られて、Dengklekが負ける。勝つ方はなるべく多く、負ける方はなるべく少なく取れば良い。 #inc…

SRM525

不参加。

SRM525 Div2 Easy(250) RainyRoad

RainyRoad #include <string> #include <vector> using namespace std; class RainyRoad{public: string isReachable( vector <string> road ) { for ( int i=0; i<(int)road[0].size(); i++ ) if ( road[0][i]=='W' && road[1][i]=='W' ) return "NO"; return "YES"; }};</string></vector></string>

SRM525 Div1 Medium(525) Rumor

Rumor聞いた噂はなるべく広めたほうが良いし、1度広めた噂をもう1度広める意味は無いので、噂の広がるスピードを決めるのは、両方の噂を同時に聞いた場合に次のステップでどちらを広めるかということのみ。N≦16なので、それぞれのウサギがどちらの噂を先に…

SRM525 Div1 Easy(300), Div2 Medium(600) DropCoins

DropCoins残るのは矩形の中にあるコイン。全ての矩形についてコインがK枚かどうかを調べる。 #include <string> #include <vector> using namespace std; class DropCoins{public: int getMinimum( vector <string> board, int K ) { int H = (int)board.size(); int W = (int)board[</string></vector></string>…

SRM524 Div2 Hard(1000) MultiplesWithLimit

MultiplesWithLimit最初の例だと、1桁目は0で4が繰り上がる。2桁目は0で繰り上がるのは2か7。2が繰り上がっている場合は次に繰り上がるのは1か5……。頂点数Nの有向グラフを考えて、0, 1, ……, N-1を割り当てる。aが繰り上がっているときに制限を満たす数字を出…

SRM522 Div1 Medium(450) CorrectMultiplication

CorrectMultiplication |A-a|+|B-b|+|AB-c|A,B≧1であることから、Aを固定してBを動かしたとき、BよりABのほうが大きく動くので、AB=cとすると値が最小になる。整数なので、その近辺の値を調べる。AとBのうち小さい方を動かすと、A, Bの最大値をnとして、O(√n…

SRM527 Div2 Hard(950) P8XCoinChangeAnother

P8XCoinChangeAnotherans[]を辞書順最小の解、ans[i]≧2とすると、j≧i+2についてans[j]=0。なぜならば、ans[j]>0となるjが存在したとすると、ans[i]-=2, ans[i+1]+=1, ans[j-1]+=2, ans[j]-=1として、より辞書順の小さい解が作れてしまう。すなわち、ansの中…

SRM527 Div2 Easy(250) P8XMatrixTransformation

P8XMatrixTransformation1種類の操作しかできないと言いながら、任意の配置にすることが可能なので、1の個数が等しいかどうかだけ見れば良い。 #include <string> #include <vector> using namespace std; class P8XMatrixTransformation{public: string solve( vector <string> orig</string></vector></string>…

SRM527 Div1 Medium(450) P8XMatrixRecovery

P8XMatrixRecovery頂点数が2Cの二部グラフを考える。rowsのi番目の列と、columnsのj番目の要素に、矛盾が無ければ、左側のi番目の点と右側のj番目の間に辺があるとする。この二部グラフに完全マッチが存在する時かつその時に限り、マトリックスが存在する。…

SRM527 Div1 Easy(275), Div2 Medium(550) P8XGraphBuilder

P8XGraphBuilder動的計画法。点数がiで木の数がjの森の最大コスコアを覚えておけば良い。それぞれの木に片方だけが繋がった辺(?)が1本ずつあるとして計算しておくと楽。点数が2以上ならば次数1の頂点が少なくとも1個あるはずなので、そこを最後にする…

SRM527

Easy (275) 127.51 Medium (450) 301.90 Hard (1050) 0 Challenge 0 結果 143位 2057→2085

SRM526 Div1 Easy(250), Div2 Medium(500) DucksAlignment

DucksAlignmentカモの並べ方について全探索。カモのxとy座標をそれぞれソートしておけば、順番に並べるのが最適。問題の1列にカモは高々1匹という制約から、カモの移動中に他のカモが邪魔になることはない。 #include <string> #include <vector> #include <algorithm> using namespac</algorithm></vector></string>…

SRM526

Easy (250) 207.70 Medium (500) 0 Hard (1000) 0 Challenge 0 結果 137位 2064→2056

SRM524 Div2 Easy(250) ShippingCubes

ShippingCubes #include <algorithm> using namespace std; class ShippingCubes{public: int minimalCost( int N ) { int ans = N+2; for ( int x=1; x<=N; x++ ) for ( int y=1; y<=N; y++ ) for ( int z=1; z<=N; z++ ) if ( x*y*z==N ) ans = min( ans, x+y+z ); re</algorithm>…

SRM524 Div1 Medium(500) LongestSequence

LongestSequenceCの要素数が2の場合が↓に載っていた。数列の長さが絶対値の和を超えることは無いらしい。Solution for October 2008 - Math Central長さnの数列vを考える。Si = Σj=0i-1v[i]とすると、長さkの全ての連続した部分列の和が正であることと、Si<Si+kが全てのiについて成り立つことは同値。Sの大小関係が決まるので、それをグラフの有向辺として、グラフが閉路を持たなければそのような数列Sが作れる。閉路があればSは作れない。順番に調べていっても間に合ったけど、二分探索の方が安全。 #include <vector> u</si+kが全てのiについて成り立つことは同値。sの大小関係が決まるので、それをグラフの有向辺として、グラフが閉路を持たなければそのような数列sが作れる。閉路があればsは作れない。順番に調べていっても間に合ったけど、二分探索の方が安全。>…

SRM524 Div1 Easy(250), Div2 Medium(500) MagicDiamonds

MagicDiamondsn=1ならば1回、n=2ならば2回、n=3ならば3回。nが4以上の素数ならばn-1は必ず合成数になるので、2回。 class MagicDiamonds{public: long long minimalTransfer( long long n ) { if ( n<=3 ) return n; for ( long long i=2; i*i<=n; i++ ) if …

SRM524

Easy (250) 238.90 Medium (500) 190.54 Hard (900) 0 Challenge 0 結果 48位 1962→20642000点台復帰&自己ベスト更新(`・ω・´)

SRM523 Div2 Hard(1000) SmallBricks31

SmallBricks31動的計画法。下から順にブロックを積んでいき、現在のx,y座標と上に出ているブロックの配置ごとにパターン数を覚えておく。 #include <vector> using namespace std; int M = 1000000007; int w, h; vector<int> B; vector<vector<vector<int> > > memo; int BT( int x, int y )</vector<vector<int></int></vector>…

SRM523 Div2 Easy(250) AlphabetPath

AlphabetPath #include <string> #include <vector> using namespace std; class AlphabetPath{public: string doesItExist( vector <string> letterMaze ) { int w = (int)letterMaze[0].size(); int h = (int)letterMaze.size(); int c = 0; for ( int y=0; y</string></vector></string>

SRM523 Div1 Medium(500) BricksN

BricksN動的計画法。幅iのブロックの上に高さが高々jになるようにブロックを積む場合の数を覚えておく。全くブロックを積まない場合が1通り。あとは最左のブロックの固まりを置く場所ごとに、ブロックの固まりの作り方×上の積み上げ方×1つ隙間を空けて右の…

SRM523 Div1 Easy(250), Div2 Medium(500) CountingSeries

CountingSeries等比数列は数が少ないので、等差数列の個数をまず求め、等差数列に含まれない等比数列の要素の個数を加える。 d==1は別扱いしないと処理が終わらないとか、upperBound

SRM523

Easy (250) 224.93 Medium (500) 270.51 Hard (900) 0 Challenge 0 結果 109位 1898→1962また2000点台が見えてきた(`・ω・´)

SRM522 Div2 Hard(900) CorrectMultiplicationTwo

CorrectMultiplicationTwo全部を1にすれば常に正しくなるので、答えは高々a+b+c-3。AとBの値を探索してA*Bがc+(a+b+c-3)より大きくなったら処理を打ち切るようにすれば、制限時間に間に合う。 #include <algorithm> using namespace std; class CorrectMultiplicationTw</algorithm>…

SRM522 Div2 Easy(250) PointErasingTwo

PointErasingTwo #include <vector> using namespace std; class PointErasingTwo{public: int getMaximum( vector <int> y ) { int n = (int)y.size(); int ans = 0; for ( int x1=0; x1</int></vector>

SRM522 Div1 Easy(250), Div2 Medium(550) RowAndCoins

RowAndCoinsどちらかの端がAならばAliceが勝てる。それ以外の場合はBobの勝ち。Aliceがどちらかの端を取るなら、Bobは他方の端1個を残せる。Aliceがどちらかの端を1個だけ残すならば、Bobはその1個を残せる。AliceがB…B○○○B…B、B…B○○○A…B、B…A○○○B……Bの形…