https://codility.com/programmers/lessons/15
最初問題を勘違いしておりまして、長さ>=Kになったようなロープは取り除けるのだとおもってましたが、そうではなく、ずっと列に残るのですね。
ということは、これは簡単にgreedy algorithmがロープを結ぶのに使えるということです。
こう考えてみましょう。いま、現在で最大の数の長さ>=Kというようなロープが出来ています。で、間にいろいろと使われなかったロープが残っているとしますね。この使われなかったロープを先頭から右にあるロープに順々に結んでいっても、既にある最大の数の長さ>=Kのロープの数はかわらないですよね。長くなるだけで。もし増えちゃったら、最初の課程がまちがってるってとになります。(となりのロープとしか結べないのを忘れないようにしましょう!)
なので、左から右に先頭から順につなげて行って長さkを超えたら一本できたと考えて、次のロープを作って行けばいいんですね。
これで100%の解答になります。
int solution(int K, int A[], int N) { int cnt = 0; int current = 0; int i; for (i = 0; i < N; i++){ current += A[i]; if (current >= K){ cnt++; current = 0; } } return cnt; }
0 件のコメント:
コメントを投稿