中中纳新 解题报告

来源:互联网 发布:windows 98 编辑:程序博客网 时间:2024/04/30 10:24
 

中中纳新

Description

新学期开学了,高一的小朋友们蹦蹦跳跳的入学了,oi小组也开始招收新同学了!

由于今年的宣传很到位,有n个来报名的小朋友。已知一个负责报名的人在同一时间内只能接待一个小朋友,并且因为每个人的个人“素质”不同,报名的用时是不同的(比如:loli就比凤姐用时间长)。有些意志特别不坚定的小朋友会因为等待时间太长而放弃报名,所以中中想要使平均等待时间最短。

中中现在想知道:1.如果只有他一个人负责报名的最短平均等待时间

                2.如果他让手下k名OIer负责报名的最短平均等待时间

已知n个人的报名用时,请你回答中中的问题。

注意:1.一旦有OIer帮忙则中中就只负责大局而不负责报名了

      2.一个人的报名时间也算在这个人的等待时间里

InputFormat

第一行两个整数n,k,n表示报名的小朋友数,k表示中中打算拉上的Oier接下来的一行有n个整数,表示n个小朋友的报名用时

OutputFormat

输出文件有且仅有两行。

第一行输出只有中中负责报名的最短平均用时

第二行输出有k个OIer帮忙的最短平均用时

输出保留小数点后2位,注意四舍五入

SampleInput

10 2

56 12 1 99 1000 234 33 55 99 812

SampleOutput

532.00

336.00

TimeLimitation

各个测试点1s

Hint

40%的数据 n≤400   k≤100

60%的数据 n≤5000  k≤700

100%的数据 n≤10000 k≤1000

 

直接排序后贪心

 

var a:array[0..10000] of longint;n,m,i,j,k,now,sum:longint;procedure qsort(l,r:longint);var i,j,k,x:longint;begin i:=l; j:=r; x:=a[(l+r) div 2]; repeat  while a[i]<x do inc(i);  while a[j]>x do dec(j);  if i<=j then   begin    k:=a[i]; a[i]:=a[j]; a[j]:=k;    inc(i); dec(j);   end; until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j);end;begin {assign(input,'p1.in'); assign(output,'p1.out'); reset(input); rewrite(output);} readln(n,m); for i:=1 to n do  read(a[i]); qsort(1,n); j:=0; sum:=0; for i:=1 to n do  begin   j:=j+a[i]; sum:=sum+j;  end; writeln(sum/n:0:2); sum:=0; for k:=1 to m do  begin   now:=k; j:=0;   while now<=n do    begin     j:=j+a[now]; sum:=sum+j;     now:=now+m;    end;  end; writeln(sum/n:0:2); {close(input); close(output);}end.

原创粉丝点击