• 【排序】琦琦的艺术照片


    题目描述

    琦琦是一个漂亮的小女孩,。很多人都说她像洋娃娃。有一天,她还把自己的艺术照拿回幼儿园向小朋友炫耀,也许是因为琦琦的艺术照太漂亮,很多小朋友都找她要艺术照片,那些照片可是非常珍贵的,她到底应该把照片给谁呢?
    一共有n个人(以1~n编号)向琦琦要照片.而琦琦只能把照片给其中的k个人。琦琦按照与他们的关系好坏程度给每个人赋予了一个初始权值W[i]。然后将初始权值从大到小进行排序,每人就有了一个序号D[i](取值同样是1~n)。按照这个序号对10取模的值将这些人分为10类。也就是说定义每个人的类别序号C[i]的值为(D[i]-1)mod 10+1,显然类别序号的取值为l~10。第i类的人将会额外得到E[i]的权值。你需要做的就是求出加上额外权值以后,最终的权值最大的k个人,并输出他们的编号。权值都是正整数。在排序中,如果两人的W[i]相同,编号小的优先。

    输入

    共3行:
    第1行输出用空格隔开的两个整数,分别是n (O<n≤50000)和k(0≤k≤n);
    第2行给出了10个正整数,分别是E[1]到E[10](0<E[i]≤50000);
    第3行给出了n个正整数,第i个数表示编号为i的人的权值w[i] (o<w[i]≤50000)。

    输出

    只需输出1行用空格隔开的k个整数,分别表示最终的W[i]从高到低的人的编号。

    样例输入

    10 10
    1 2 3 4 5 6 7 8 9 10
    2 4 6 8 10 12 14 16 18 20
    

    样例输出

    10 9 8 7 6 5 4 3 2 1

    题目的意思是让你把w[i]按照从小到大排序后,获得每个人的序号,然后再去根据序号获得类别序号,加上相应的e的值,编号是起初给你的顺序。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct node
     5 {
     6     int id,wi;
     7 }mp[50005];
     8 bool cmp(node a,node b)
     9 {
    10     if(a.wi==b.wi)  return a.id<b.id;
    11     return a.wi>b.wi;
    12 }
    13 int n,k,e[20],w[50005];
    14 int main()
    15 {
    16     scanf("%d%d",&n,&k);
    17     for(int i=1;i<=10;i++)
    18         scanf("%d",&e[i]);
    19     for(int i=1;i<=n;i++)
    20     {
    21         scanf("%d",&w[i]);
    22         mp[i].wi=w[i];
    23         mp[i].id=i;
    24     }
    25     sort(mp+1,mp+1+n,cmp);
    26     for(int i=1;i<=n;i++)
    27         mp[i].wi+=e[(i-1)%10+1];
    28     sort(mp+1,mp+1+n,cmp);
    29     for(int i=1;i<=k;i++)
    30     {
    31         if(i!=1)    printf(" ");
    32         printf("%d",mp[i].id);
    33     }
    34     printf("
    ");
    35     return 0;
    36 }
    View Code
    如有错误,请指正,感谢!
  • 相关阅读:
    operator[],识别读操作和写操作
    COW写时复制
    嵌套类,PIMPL
    类型转换
    String类运算符重载,自己实现
    socket的几个配置函数
    TCP三次握手,四次挥手,状态变迁图
    运算符重载
    友元
    P4016 负载平衡问题(最小费用最大流)
  • 原文地址:https://www.cnblogs.com/scott527407973/p/9427003.html
Copyright © 2020-2023  润新知