zoukankan      html  css  js  c++  java
  • 中国大学MOOC-数据结构基础习题集、08-1、Talent and Virtue

    题目链接:http://www.patest.cn/contests/mooc-ds/08-1

    题目分析:这是一道考察排序算法的一道题。如果对题目不懂的话,这里恰巧有一个中文题目,不妨看一下:

      http://www.patest.cn/contests/pat-b-practise/1015

    特别说明:

      1. 这道题有一个很大的坑,如果用C++的cin和cout运行会超时。要使用C语言的scanf和printf。博主也是看了别人的博客才发现问题所在。如果你的用例3用例4超时的话,不妨更改一下。

      2. 建立4个vector,分别存圣人、君子、愚人、小人的信息。对每个vector的排序算法相同:先总分降序、再德分降序、再准考证号升序。因此,排序函数是本道题的重点,解决了排序问题,也就解决了这道题。博主这里使用的是标准库中是sort函数,使用方法非常简单:

    1     sort(vec1.begin(), vec1.end(), cmp);
    2     // 以下省略其他3个vector

      关键是如何编写cmp函数,这里我们按照题目的需求,编写cmp函数如下:

     1 int cmp(const node &x, const node &y)
     2 {
     3     int scoreA = x.b + x.c;
     4     int scoreB = y.b + y.c;
     5     if (scoreA != scoreB)
     6         return scoreA > scoreB;
     7     else
     8     {
     9         if (x.b != y.b)
    10             return x.b > y.b;
    11         else
    12             return x.a < y.a;
    13     }
    14 }

      3. 其实博主这里偷懒了,没有自己写排序函数。事实上,标准库的排序函数(sort,qsort,stable_sort)在大多数情况都能满足我们的需求。如果能借助现有的函数(或工具)能简化我们的编码,既能提高我们的编码效率,又能让别人更容易读懂我们的代码,出错率低、可移植性高,那么何乐而不为呢?当然,对于“数据结构”这门课程来言,其实还是推荐大家自己编写代码的。

    代码分析:

    • 头文件声明及结构体的定义:1~16
    • cmp函数的定义(核心):17~30
    • 处理输入部分,并判断是圣人、君子、愚人或小人,放入对应vector里:31~55
    • 调用排序函数,输出最后结果:56~70
     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <vector>
     4 
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     int a, b, c;
    10     node(int x, int y, int z):a(x), b(y), c(z) {}
    11     void output()
    12     {
    13         printf("%d %d %d
    ", a, b, c);
    14     }
    15 };
    16 
    17 int cmp(const node &x, const node &y)
    18 {
    19     int scoreA = x.b + x.c;
    20     int scoreB = y.b + y.c;
    21     if (scoreA != scoreB)
    22         return scoreA > scoreB;
    23     else
    24     {
    25         if (x.b != y.b)
    26             return x.b > y.b;
    27         else
    28             return x.a < y.a;
    29     }
    30 }
    31 
    32 int main()
    33 {
    34     int n, l, h;
    35     scanf("%d%d%d", &n, &l, &h);
    36     vector<node> vec1;
    37     vector<node> vec2;
    38     vector<node> vec3;
    39     vector<node> vec4;
    40     for(int i=0; i<n; i++)
    41     {
    42         int a, b, c;
    43         scanf("%d%d%d", &a, &b, &c);
    44         if(b < l || c < l)
    45             continue;
    46         if(b >= h && c >= h)
    47             vec1.push_back(node(a, b, c));  // 圣人
    48         else if(b >= h && c < h)
    49             vec2.push_back(node(a, b, c));  // 君子
    50         else if(b < h && c < h && b >= c)
    51             vec3.push_back(node(a, b, c));  // 愚人
    52         else
    53             vec4.push_back(node(a, b, c));  // 小人
    54 
    55     }
    56     printf("%d
    ", vec1.size() + vec2.size() + vec3.size() + vec4.size());
    57     sort(vec1.begin(), vec1.end(), cmp);
    58     sort(vec2.begin(), vec2.end(), cmp);
    59     sort(vec3.begin(), vec3.end(), cmp);
    60     sort(vec4.begin(), vec4.end(), cmp);
    61     for(int i=0; i<vec1.size(); i++)
    62         vec1[i].output();
    63     for(int i=0; i<vec2.size(); i++)
    64         vec2[i].output();
    65     for(int i=0; i<vec3.size(); i++)
    66         vec3[i].output();
    67     for(int i=0; i<vec4.size(); i++)
    68         vec4[i].output();
    69     return 0;
    70 }

    AC成果:

  • 相关阅读:
    设置允许跨域访问
    设计模式学习笔记(1)——单例模式
    yii2 request文件简介
    YII2 添加全局自定义函数
    第2章 查询基础
    第1章 数据库和SQL
    第0章 绪论
    用户贷款风险预测—特征提取
    用户贷款风险预测—数据探索
    Python 数据分析—画图
  • 原文地址:https://www.cnblogs.com/clevercong/p/4242965.html
Copyright © 2011-2022 走看看