配列を交互に足す 番兵の有効活用
降順に並んだ配列が二つあるとする.サイズは同じとは限らない.
配列を作るときに0を仕込んでおく。(番兵)
//0入れる前にa.size(), b.size()を確定させる. a: 7 5 4 2 0 b: 8 3 1 0 //交互に足していって、stop以上になるときの最小の要素数を返す. //例)20::7->8->5 ans = 3; //8,7,3,5とやってしまうと、死亡。 //例)30::7->8->5->3->...1->2 ans = 7; //例)31:: ans = -1;
以下、解答.
if(a[0] >= stop || b[0] >= stop) { return 1; } int dst = 0; int ans = -1; for(int i = 0; i < min(a.size, b.size); ++i) { dst += a[0] + b[0]; if(dst >= stop) { ans = (i+1)*2; break; } if(dst + a[i+1] >= stop || dst + b[i+1] >= stop) { //i+1でout_of_rangeしそうだが、番兵のおかげで0を足したことになり、計算がすっきりする. ans = 1+(i+1)*2; break; } } return ans; }
これが一番簡単そう.
配列が二つしかないから、番兵を使わなくても条件分岐3つ位しておけばこれくらいなら何とかなりそうだけど、
n個の配列を……と考えるともう太刀打ちできなくなる.