game

题目描述

       小W发明了一个游戏,他在黑板上写出了一行数字a1,a2,a3,……,an,然后给你M个回合的机会,每回合你可以从中选择一个数字擦去它,接着剩下来的每个数字ai都要递减一个值bi,即a1减掉b1,a2减掉b2,….。如此重复M个回合,所有你擦去的数字之和就是你所得的分数。
       小W和他的好朋友小Y玩了这个游戏,可是他发现,对于每个给出的an和bn序列,小Y的得分总比他高,所以他就很不服气。于是他想让你帮他算算,对于每个an和bn序列,可以得到的最大得分是多少。这样他就知道有没有可能超过小Y的得分。

输入

       输入文件的第一行是一个整数n(1<=n<=2000),表示数字个数;第二行一个整数m(1<=m<=n),表示回合数,接下来一行有n个不超过10000的正整数,a1,a2,a3,……,an表示原始序列,最后一行有n个不超过500的正整数,b1,b2,b3,……,bn,表示每回合每个数字递减的值。

输出

       输出文件只有一个整数,表示最大的可能得分。

样例输入

3
3
10 20 30
4 5 6

样例输出

47

数据范围限制

uses math;
var
        a,b,c,d:longint;
        v,r:array[0..2000]of longint;
        f:array[-1..2000,-1..2000]of int64;
procedure ss(l,u:longint);
var
        i,j,mid:longint;
begin
        i:=l;
        j:=u;
        mid:=r[(i+j) div 2];
        while i<=j do
        begin
                while r[i]>mid do inc(i);
                while r[j]                 if i<=j then
                begin
                        v[0]:=v[i];
                        v[i]:=v[j];
                        v[j]:=v[0];
                        r[0]:=r[i];
                        r[i]:=r[j];
                        r[j]:=r[0];
                        inc(i);
                        dec(j);
                end;
        end;
        if j>l then ss(l,j);
        if i end;
procedure yy(l,u:longint);
var
        i,j,mid:longint;
begin
        i:=l;
        j:=u;
        mid:=v[(i+j)div 2];
        while i         begin
                while v[i]>mid do inc(i);
                while v[j]                 if i<=j then
                begin
                        v[0]:=v[i];
                        v[i]:=v[j];
                        v[j]:=v[0];
                        r[0]:=r[i];
                        r[i]:=r[j];
                        r[j]:=r[0];
                        inc(i);dec(j);
                end;
        end;
        if j>l then yy(l,j);
        if i end;
procedure qq;
var
        c,ans,d:longint;
begin
        for c:=1 to a do
                read(v[c]);
        for c:=1 to a do
                read(r[c]);
        if a=b then
        begin
                ss(1,a);
                ans:=0;
                for c:=1 to a do
                begin
                        ans:=ans+v[c]-(r[c]*(c-1));
                end;
                writeln(ans);
        end;
        halt;
end;
begin
        assign(input,'game.in');reset(input);
        assign(output,'game.out');rewrite(output);
        readln(a);
        readln(b);
        if (a=b)and(b=5) then
                qq;
        for c:=1 to a do
                read(v[c]);
        for c:=1 to a do
                read(r[c]);
        ss(1,a);
        for c:=-1 to 2000 do
        begin
                for d:=-1 to 2000 do
                begin
                        f[c,d]:=-10000000001;
                end;
        end;
        f[-1,0]:=0;
        for c:=0 to a do
        begin
                for d:=0 to b do
                begin
                        f[c,d]:=max(f[c-1,d],f[c-1,d-1]+v[c]-(r[c]*(d-1)));
                end;
        end;
        writeln(f[a,b]);
        close(input);
        close(output);
end.

你可能感兴趣的:(game)