宁波2008.2 宝石

【问题描述】
见上帝动了侧隐之心,天后也想显示一下慈悲之怀,随即从身上解下腰带,让身边的美神维纳斯拿到固天圈上去试试,如果腰带触碰到固天圈上镶嵌着的连续的宝石,就将这些宝石送给人们。维纳斯想让腰带触碰到更多的宝石,可要在短短的1秒钟之内解决问题,也感到力不从心,你能帮帮她吗?
固天圈上按顺时针方向标有1、2、……、t共t个点,当然第t点顺时针方向的下一个点是第1点。相邻两点之间的距离均为1厘米。
在这t个点中有n个点处镶嵌有宝石,每个宝石均有一定的价值。以长度为k厘米的腰带覆盖至固天圈上,怎样才能获得最多价值的宝石呢?
【输入】
输入文件gem.in 有三行:
第1行有三个正整数n、t、k(互相之间用一个空格分隔),表示有n个位置上有宝石,固天圈上的最大标号为t,腰带长度为k厘米。
第2行有n个不超过t的正整数,表示镶嵌着的宝石的位置,互相之间用一个空格分隔。
第3行有n个不超过10000的正整数,表示对应位置上宝石的价值,互相之间用一个空格分隔。
【输出】
输出文件gem.out只有一个正整数,为腰带能触碰到的宝石价值和的最大值。
 【样例输入1】
3 11 2
9 5 11
4 6 5
【样例输入2】
3 11 5
9 5 11
4 6 5
【样例输出1】
9
【样例输出2】
11

30%的数据,1≤n≤100,1≤t≤1000,1≤k≤10。
70%的数据,1≤n≤2000,1≤t≤3000,1≤k≤200。

100%的数据,1≤n≤100000,1≤t≤100000000,1≤k≤100000。


var n,t,k,i,j,x,ans,max:longint;
a,b:array[1..200000]of longint;
procedure qsort(l,r:longint);
var i,j,m,t:longint;
begin
  i:=l;j:=r;
  m:=a[(l+r) div 2];
  repeat
    while a[i]<m do inc(i);
    while a[j]>m do dec(j);
    if i<=j then
    begin
      t:=a[i];
      a[i]:=a[j];
      a[j]:=t;
      t:=b[i];
      b[i]:=b[j];
      b[j]:=t;
      inc(i);
      dec(j);
    end;
  until i>j;
  if l<j then qsort(l,j);
  if i<r then qsort(i,r);
end;
begin
  readln(n,t,k);
  for i:=1 to n do read(a[i]);
  for i:=1 to n do
  begin
    read(x);
    b[i]:=x;
  end;
  qsort(1,n);
  for i:=1 to k do a[n+i]:=a[i]+t;
  for i:=1 to k do b[n+i]:=b[i];
  for i:=1 to n do
  begin
    ans:=b[i];
    j:=i+1;
    while (a[j]<=a[i]+k) do
    begin
      ans:=ans+b[j];
      inc(j);
    end;
    if ans>max then max:=ans;
  end;
  write(max);
end.


你可能感兴趣的:(宁波2008.2 宝石)