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 件のコメント:
コメントを投稿