Problem:
お客様大感謝祭

悪天候が続き野菜の価格が高騰する中、セブンマートではお客様に野菜のまとめ買いセールを実施しています。 日ごろなかなか店頭に並ばない野菜もお手頃価格で手に入るとあって、 店内はとても賑わっています。

ある日、松長団地に住む仲良し 3 人組がセブンマートの広告を手に話に花を咲かせていました。今回のセールは「お客様大感謝祭」と銘打っただけに、袋詰めした野菜の中で最も安いものが無料になるのが目玉となっています。広告を読んでみると、どうやら以下のようなセールのようです。

1 つの袋には m 個まで野菜を詰められる。

野菜が m 個詰めてある袋については、その中で最も安い野菜が無料となる。

野菜の個数が m 個に達しない袋は割引の対象外。

3人は早速セブンマートへ買い物に行きました。

買い物が終わり、 お店の外で待ち合わせた 3 人は安くてたくさん購入できたことに満足した様子で話をしていると、どうやら 3 人とも同じ野菜を購入していたことが分かりました。ある一人が、「本当に安いわよねぇ。これでXXX円だもの!」と言うと、もう一人は、「え?私はそれより**円高かったわ!どうして?」と驚き、また、残りの一人はレシートを見て自分が一番安く購入したことに気付きました。

さて、どのように袋詰めすれば購入価格を一番安くできるでしょうか。 購入する野菜の個数、袋に入る野菜の個数、各野菜の値段を入力とし、最低購入価格を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

n m
p1 p2 ... pn

1 行目に購入する野菜の個数 n (1 ≤ n ≤ 1000) と袋に入る野菜の個数 m (1 ≤ m ≤ 1000)　が与えられます。２行目に各野菜の値段 pi (10 ≤ pi ≤ 10000) が与えられます。

データセットの数は 100 を超えません。

Output

入力データセットごとに、最低購入価格を１行に出力します。

Sample Input

4 2
50 40 100 80
7 3
400 300 100 700 200 600 500
0 0

Output for the Sample Input

150
2100

Solution in C (judge verdict: Accepted)

#include <stdio.h>
#define min(a, b) ((a) < (b) ? (a) : (b))

int main(void)
{
    int n, m;

    while (scanf("%d %d", &n, &m), n){
        int p[2048] = {0};
        int i, j;
        int sum = 0;

        for (i = 0; i < n; i++){
            int tmp;

            scanf("%d", &tmp);
            for (j = i; j > 0 && tmp > p[j - 1]; j--){
                p[j] = p[j - 1];
            }
            p[j] = tmp;
        }

        for (i = 0; i < n / m + 1; i++){
            for (j = 0; j < m; j++){
                sum += p[i * m + j];
            }
            sum -= p[i * m + j - 1];
        }
        printf("%d\n", sum);
    }

    return 0;
}