zoukankan      html  css  js  c++  java
  • 7-40 奥运排行榜 (25分)--sort()排序,结构体,前驱

      1 #include <iostream>
      2 #include <algorithm>
      3 using namespace std;
      4 struct node//定义国家结构体
      5 {
      6     int order;
      7     double gold, mdl, ppl;
      8     int rank[5];
      9 }con[300];
     10 //4个比较函数
     11 bool cmp1(node a, node b)
     12 {
     13     return a.gold > b.gold;
     14 }
     15 bool cmp2(node a, node b)
     16 {
     17     return a.mdl > b.mdl;
     18 }
     19 bool cmp3(node a, node b)
     20 {
     21     return a.gold / a.ppl > b.gold / b.ppl;
     22 }
     23 bool cmp4(node a, node b)
     24 {
     25     return a.mdl / a.ppl > b.mdl / b.ppl;
     26 }
     27 int main()
     28 {
     29     int N, M;
     30     cin >> N >> M;
     31     for (int i = 0; i < N; i++)
     32     {
     33         con[i].order = i;
     34         cin >> con[i].gold >> con[i].mdl >> con[i].ppl;
     35     }
     36     struct node con2[300];//将con拷贝一份到con2,con保持不动,用con2来排序
     37     for (int i = 0; i < N; i++)
     38     {
     39         con2[i].order = con[i].order;
     40         con2[i].gold = con[i].gold;
     41         con2[i].mdl = con[i].mdl;
     42         con2[i].ppl = con[i].ppl;
     43     }
     44     int cst[300];//存放要咨询的国家编号
     45     for (int i = 0; i < M; i++)
     46     {
     47         cin >> cst[i];
     48     }
     49     int front[300];//front存放前驱结点,用于处理并列名次的情况,相同名次的国家有相同“根节点”,它们的排名就是它们根节点的排名
     50     sort(con2, con2 + N, cmp1);
     51     for (int i = 0; i < N; i++) front[i] = i;//处理前需要将front初始化
     52     for (int i = 0; i < N; i++)
     53     {
     54         int k;//k为排名对应的下标,真实排名是k+1
     55         if (i == 0 || con2[i].gold != con2[i - 1].gold)k = i;//如果没有并列的情况,名次就是i+1
     56         else
     57         {
     58             front[i] = front[i - 1];
     59             k = i;
     60             while (k != front[k])//注意这里while循环用意是处理并列排名的情况
     61             {
     62                 k = front[k];
     63             }
     64             //while处理完后k的值是多个并列数据中排在最前面的那个的下标,即这一组并列数据的排名都是此时的k值再+1
     65         }
     66         con[con2[i].order].rank[1] = k + 1;
     67     }//以下都是类似的方法
     68     sort(con2, con2 + N, cmp2);
     69     for (int i = 0; i < N; i++) front[i] = i;
     70     for (int i = 0; i < N; i++)
     71     {
     72         int k;
     73         if (i == 0 || con2[i].mdl != con2[i - 1].mdl)k = i;
     74         else
     75         {
     76             front[i] = front[i - 1];
     77             k = i;
     78             while (k != front[k])
     79             {
     80                 k = front[k];
     81             }
     82         }
     83         con[con2[i].order].rank[2] = k + 1;
     84     }
     85     sort(con2, con2 + N, cmp3);
     86     for (int i = 0; i < N; i++) front[i] = i;
     87     for (int i = 0; i < N; i++)
     88     {
     89         int k;
     90         if (i == 0 || con2[i].gold / con2[i].ppl != con2[i - 1].gold / con2[i - 1].ppl)k = i;
     91         else
     92         {
     93             front[i] = front[i - 1];
     94             k = i;
     95             while (k != front[k])
     96             {
     97                 k = front[k];
     98             }
     99         }
    100         con[con2[i].order].rank[3] = k + 1;
    101     }
    102     sort(con2, con2 + N, cmp4);
    103     for (int i = 0; i < N; i++) front[i] = i;
    104     for (int i = 0; i < N; i++)
    105     {
    106         int k;
    107         if (i == 0 || con2[i].mdl / con2[i].ppl != con2[i - 1].mdl / con2[i - 1].ppl)k = i;
    108         else
    109         {
    110             front[i] = front[i - 1];
    111             k = i;
    112             while (k != front[k])
    113             {
    114                 k = front[k];
    115             }
    116         }
    117         con[con2[i].order].rank[4] = k + 1;
    118     }
    119 
    120     for (int i = 0; i < M; i++)
    121     {
    122         int order = cst[i];//题目说当多个计算方式排名相同时,输出最小编号的方式,这里利用<和<=可实现这一目的。
    123         if (con[order].rank[1] <= con[order].rank[2] && con[order].rank[1] <= con[order].rank[3] && con[order].rank[1] <= con[order].rank[4])
    124             cout << con[order].rank[1] << ":1";
    125         else if (con[order].rank[2] < con[order].rank[1] && con[order].rank[2] <= con[order].rank[3] && con[order].rank[2] <= con[order].rank[4])
    126             cout << con[order].rank[2] << ":2";
    127         else if (con[order].rank[3] < con[order].rank[1] && con[order].rank[3] < con[order].rank[2] && con[order].rank[3] <= con[order].rank[4])
    128             cout << con[order].rank[3] << ":3";
    129         else if (con[order].rank[4] < con[order].rank[1] && con[order].rank[4] < con[order].rank[2] && con[order].rank[4] < con[order].rank[3])
    130             cout << con[order].rank[4] << ":4";
    131         if (i != M - 1)cout << ' ';
    132     }
    133     return 0;
    134 
    135 }
  • 相关阅读:
    DateTime的精度小问题
    使用For XML PATH 会影响Cross Apply 返回
    一个update的小故事
    行大小计算测试
    Sql Server 2008R2 遇到了BCP导入各种中文乱码的问题
    php-fpm 启动不了 libiconv.so.2找不到
    Git使用教程
    支付宝接口使用文档说明 支付宝异步通知
    Linux(CentOs6.4)安装Git
    NGINX防御CC攻击教程
  • 原文地址:https://www.cnblogs.com/2020R/p/12773003.html
Copyright © 2011-2022 走看看