SSL P1255 佳佳的魔法照片

题目大意:
有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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值