• 数据离散化


    1.5.4 人物风云榜

    Description

    又到了云之国一年一度的任务风云榜更新的大日子了。
    给出每个人风云力数值,需要你给出每个人的排名。注意,排名存在并列的情况。

    Input

    一共有 222 行。
    第一行一个整数 nnn ,表示一共有 nnn 个人。
    第二行有nnn个空格隔开的整数。第iii个数aia_iai​表示第iii个人的风云力数值。

    Output

    输出仅一行,共n个整数,第iii个数ai表示第i个人的风云榜排名。

    Sample Input 1

    5
    50 40 30 100 50

    Sample Output 1

    2 4 5 1 2 

    Hint

    50%的数据 1≤n≤60001 \leq n \leq 60001≤n≤6000.
    100%的数据 1≤n≤105;0&lt;ai&lt;2311 \leq n \leq 10^5;\quad 0 &lt; a_i &lt; 2^{31}1≤n≤105;0<ai​<231.

    Source

    Saikr Online Judge http://oj.saikr.com

     离散化,将原始数据的序号pos保存下来,再将值进行排序,然后开一个新的数组来记录原始序列
        的大小编号,将原始序列的pos值作为结果数组的下标,将排好序的数组的下标作为结果数组的值。这就能实现原始序列的排序。

    1. /**
    2. 离散化,将原始数据的序号pos保存下来,再将值进行排序,然后开一个新的数组来记录原始序列
    3. 的大小编号,将原始序列的pos值作为结果数组的下标,将排好序的数组的下标作为结果数组的值。
    4. 这就能实现原始序列的排序。
    5. */
    6. #include <iostream>
    7. #include <cstdio>
    8. #include <algorithm>
    9. using namespace std;
    10. struct Node
    11. {
    12. int val,pos;
    13. };
    14. bool cmp(Node a,Node b)
    15. {
    16. if(a.val!=b.val)
    17. return a.val > b.val;
    18. return a.pos < b.pos;
    19. }
    20. int main()
    21. {
    22. int n;
    23. scanf("%d",&n);
    24. Node a[n+1];
    25. int result[n+1];
    26. for(int i=1;i<=n;++i)
    27. {
    28. scanf("%d",&a[i].val);
    29. a[i].pos=i;
    30. }
    31. sort(a+1,a+n+1,cmp);
    32. for(int i=1;i<=n;++i)
    33. {
    34. if(i>1&&a[i].val==a[i-1].val)
    35. result[a[i].pos]=i-1;
    36. else
    37. result[a[i].pos]=i;
    38. }
    39. for(int i=1;i<=n;++i)
    40. {
    41. if(i==1)
    42. printf("%d",result[i]);
    43. else
    44. printf(" %d",result[i]);
    45. }
    46. return 0;
    47. }

    在来一题:

    1.5.5 点的离散化

    Description

    在平面直角坐标系上有nnn个整点(xi,yi)(x_i,y_i)(xi​,yi​).现在需要你按照从左往右,从下往上的顺序依次给每个点编号111到nnn。
    要求按照编号从小到大的顺序输出每个点的坐标;并按照点的输入顺序输出每个点的编号。

    Input

    第一行一个正整数nnn。表示点的个数。
    接下来有nnn行。第i+1i+1i+1行有两个以空格分隔的整数xi&ThickSpace;yix_i \; y_ixi​yi​。

    Output

    共n+1n+1n+1行。前nnn行分别是点的坐标,第iii行两个以空格分隔的数Xi&ThickSpace;YiX_i\; Y_iXi​Yi​,表示编号为iii的点的坐标。
    第n+1n+1n+1行,共nnn个以空格分隔开的整数。第iii个数rir_iri​表示输入中第iii个点的编号。

    Sample Input 1

    4
    0 0
    1 1
    0 3
    3 0

    Sample Output 1

    0 0
    0 3
    1 1
    3 0
    1 3 2 4

    Hint

    ∣xi∣,∣yi∣≤231−1;1≤n≤106.|x_i|,|y_i| \leq 2^{31}-1; 1 \leq n \leq 10^6.∣xi​∣,∣yi​∣≤231−1;1≤n≤106.

    Source

    Saikr Online Judge http://oj.saikr.com

    1. /**
    2. 离散化,将原始数据的序号pos保存下来,再将值进行排序,然后开一个新的数组来记录原始序列
    3. 的大小编号,将原始序列的pos值作为结果数组的下标,将排好序的数组的下标作为结果数组的值。
    4. 这就能实现原始序列的排序。
    5. */
    6. #include <iostream>
    7. #include <algorithm>
    8. using namespace std;
    9. struct Node
    10. {
    11. int x,y,pos;
    12. };
    13. bool cmp(Node a,Node b)
    14. {
    15. if(a.x!=b.x)
    16. return a.x<b.x;
    17. if(a.y!=b.y)
    18. return a.y<b.y;
    19. return a.pos<b.pos;
    20. }
    21. int main()
    22. {
    23. int n;
    24. scanf("%d",&n);
    25. Node point[n+1];
    26. for(int i=1;i<=n;++i)
    27. {
    28. scanf("%d%d",&point[i].x,&point[i].y);
    29. point[i].pos=i;
    30. }
    31. int result[n+1];
    32. sort(point+1,point+n+1,cmp);
    33. for(int i=1;i<=n;++i)
    34. {
    35. result[point[i].pos]=i;
    36. }
    37. for(int i=1;i<=n;++i)
    38. printf("%d %d\n",point[i].x,point[i].y);
    39. for(int i=1;i<=n;++i)
    40. printf("%d ",result[i]);
    41. return 0;
    42. }

  • 相关阅读:
    React 中的 Solidity 和 Ethereum (Next JS):完整指南
    利用电商数据API接口上货、铺货
    私有化部署vs公有云部署,你知道这些不同吗?
    Spring Boot Actuator详解与漏洞利用
    PMP项目整合管理
    AIGC 微调的方法
    OptiMode应用矢量有限元法模拟表面等离子体激元
    uniapp同步将本地图片转换为base64,支持微信、H5、APP
    C 语言与 C++ 语言中全局变量重新声明的行为差异
    Springboot整合之Shiro和JWT技术实现无感刷新
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/125492583