SSL JudgeOnline 2322——运输

来源:互联网 发布:反arp攻击软件 编辑:程序博客网 时间:2024/05/29 15:07

Description

现在已知N件商品,和搬运它们其中每一件的费用。现在搬家公司老板Mr.sb决定让我们每次任意选取2件商品。然后这2件商品只算一件商品的费用。但是这个商品的搬运费用是将选出的2个商品的费用之和除以k的运算结果。如此反复。直到只收一件商品的钱。这个就是商店要付的费用。掌柜的想尽可能的少付钱,以便将更多的钱捐给希望工程。所以请你帮他计算一下最少只用付多少钱。

Input

n,kw1,w2…..wn(每一件物品搬运费)

Output

一个数 最少付多少钱

Sample Input

5 2
1 2 3 4 5
Sample Output

1
Hint

n和k<=10000


这是一题贪心

每次将最大的两个数取出来,将他们的和除以K,就是这两件商品的费用之和。然后将这个数插入到数组里,使数组有序(从大到小)。再重复以上循环,直到只剩一个数,就是答案。


代码如下:

var  n,m,i,j:longint;     a:array[0..10000]of int64;procedure qsort(l,r:longint);var  i,j,mid:longint;begin  if i>=j then exit;  i:=l; j:=r; mid:=a[(j+i) div 2];  repeat    while a[i]<mid do inc(i);    while a[j]>mid do dec(j);    if i<=j then      begin        a[0]:=a[i];        a[i]:=a[j];        a[j]:=a[0];        inc(i);        dec(j);      end;  until i>j;  qsort(l,j);  qsort(i,r);end;begin  read(n,m);  for i:=1 to n do read(a[i]);  qsort(1,n);  for i:=n-1 downto 1 do    begin      a[i]:=(a[i]+a[i+1])div m;      for j:=i-1 downto 1 do        if a[j]>a[i] then          begin            a[0]:=a[i];            a[i]:=a[j];            a[j]:=a[0];          end;    end;  write(a[1]);end.
0 0
原创粉丝点击