题目大意:
有n个人(以1–n编号)向佳佳要照片,而佳佳只能给其中的k个人。佳佳给每个人赋予了一个初始权值w[i]表示关系好快度。然后将初始权值从大到小进行排序,每人就有了一个序号D[i](取值同样是1–n)。按照这个序号对10取模的值将这些人分为10类。
定义每个人的类别序号C[i]的值为(D[i]-1) mod 10 +1,显然类别序号的取值为1–10。
第i类的人将会额外得到E[i]的权值。
求加上额外权值以后,最终的权值最大的k个人,以及他们的编号。在排序中,如果两人的W[i]相同,编号小的优先。
题解:
直接排序,然后是双关键字的排序,所以记得带着他的序号去排序。
排序完以后照着题目做一下就可以了,也没什么好讲了,这题就是裸快排。
时间复杂度:O(N)
var
a,b,e:array [0..50001] of longint;
i,j,k,n:longint;
procedure qsort(l,r:longint);
var
i,j,key,mid:longint;
begin
if l>=r then exit;
i:=l; j:=r;
mid:=a[(l+r) div 2];
key:=b[(l+r) div 2];
repeat
while (a[i]>mid) or ((a[i]=mid) and (b[i]<key)) do inc(i);
while (a[j]<mid) or ((a[j]=mid) and (b[j]>key)) do dec(j);
if i<=j then
begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
inc(i); dec(j);
end
until i>j;
qsort(i,r);
qsort(l,j);
end;
begin
readln(n,k);
for i:=1 to 10 do read(e[i]);
readln;
for i:=1 to n do
begin
read(a[i]);
b[i]:=i;
end;
qsort(1,n);
for i:=1 to n do
a[i]:=a[i]+e[(i-1) mod 10+1];
qsort(1,n);
for i:=1 to k do write(b[i],' ');
end.