乐趣区

关于算法-数据结构:PAT甲级1062-Talent-and-Virtue

题目粗心:

给出 N 个考生的准考证号、Virtue_Grade、Talent_Grade 以及及格线 L、优良线 H,而后对这 n 个考生进行分类:

1.  如果 Virtue_Grade 和 Talent_Grade 中有一一个低于 L, 则为不及格生,即为第 5 类,且设上面 4 类均及格。2.  如果 Virtue_Grade 和 Talent_Grade 均不低于 H, 则为第 1 类。3.  如果 Virtue_Grade 不低于 H,Talent_Grade 低于 H, 则为第 2 类。4.  如果 Virtue_Grade 和 Talent_Grade 均低于 H 但 Virtue_Grade 不低于 Talent_Grade,则为第 3 类。
算法思路:

题目没有什么难度,次要是细节得留神,在每一个考生在输出的时候直接判断属于哪一个梯队,对于低于 L 的考生间接不予考虑,这样保障参加排序的都是须要排序的考生。排完序后间接依照要求输入即可。

排序规定:
先进行内部排序:
  1. Virtue_Grade 和 Talent_Grade 大于等于 H 的称为圣人, 排在第一梯队,外部依据总分非递增排序。
  2. Virtue_Grade 大于等于 H 然而 Talent_Grade 低于 H 的小人,排在第二梯队,外部依据总分非递增排序。
  3. Virtue_Grade 和 Talent_Grade 小于 H 然而 Virtue_Grade 大于等于 Talent_Grade 的称为哲人,排在第三梯队,外部依据总分非递增排序。
  4. 其余的 Virtue_Grade 和 Talent_Grade 大于等于 L 的称为君子,排在第四梯队,外部依据总分非递增排序。
而后进行外部排序:
 首先依照总分非递加排序,总分雷同的依照 Virtue_Grade 和 Talent_Grade 有一个低于 60 分的不参加排序 
提交后果:
第一次测试:
  测试点 2,3,4 答案谬误 
第二次测试:
  全副正确,起因在于第三梯队的 Virtue_Grade 大于等于 Talent_Grade 的等于没有增加导致出错。

AC 代码:

#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

struct People{
    int ID_Number;
    int Virtue_Grade; // Virtue_Grade
    int Talent_Grade; // Talent_Grade
    int Total_Grade; // 总分
    int level;// 梯队
};
vector<People> peoples;

bool cmp(People a,People b){if (a.level!=b.level){return a.level < b.level;} else if (a.Total_Grade!=b.Total_Grade){return a.Total_Grade > b.Total_Grade;} else if (a.Virtue_Grade!=b.Virtue_Grade){return a.Virtue_Grade > b.Virtue_Grade;} else {return a.ID_Number < b.ID_Number;}
}

int main(){
    int N,L,H;// 人数,分数上限,分数下限
    scanf("%d %d %d",&N,&L,&H);
    People people;
    for (int i = 0; i < N; ++i) {scanf("%d %d %d",&people.ID_Number,&people.Virtue_Grade,&people.Talent_Grade);
        if (people.Virtue_Grade>=L&&people.Talent_Grade>=L){
            // Virtue_Grade 和 Talent_Grade 都大于等于 L 的才进行排名
            if (people.Virtue_Grade>=H&&people.Talent_Grade>=H){
                // 圣人
                people.level = 1;
            } else if (people.Virtue_Grade>=H&&people.Talent_Grade<H){
                // 小人
                people.level = 2;
            } else if (people.Virtue_Grade>=people.Talent_Grade){
                // 哲人
                people.level = 3;
            } else{
                // 君子
                people.level = 4;
            }
            people.Total_Grade = people.Talent_Grade + people.Virtue_Grade;
            peoples.push_back(people);
        }
    }
    sort(peoples.begin(),peoples.end(),cmp);
    printf("%d\n",peoples.size());
    for (int k = 0; k < peoples.size(); ++k) {printf("%d %d %d\n",peoples[k].ID_Number,peoples[k].Virtue_Grade,peoples[k].Talent_Grade);
    }
    return 0;
}

退出移动版