-
题目大意:司马光通过道德和才能定义一个人,先定义一个最低底线low和最高标准high,
- 若一个人的道德和才能都高于high,他就是圣人;
- 若一个人的道德高于high,才能低于high高于low,他就是君子;
- 若一个人的道德低于high高于low,才能低于high高于low,但**道德>=才能(not lower than,所以是大于等于号)**他就是愚人;
- 若一个人道德<才能,他就是小人。
给一群人按照总分=道德+才能降序排序,若总分相同,则按道德降序排序,若还相同,就按id升序排序。只有道德和才能都高于high才有资格上榜。
-
思路:
- 用一个二维数组存四种人,这样就不用定义四个数组,可以减少代码量;
- 判断这个人属于哪种人,若满足条件,就放进二维数组相应的列里。
-
知识点:
- 结构体
- vector
- sort
-
代码:
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct man{ // char id[8]; // 用这个末尾会多一个字符,为什么呢? int id; int v, t, total; }; bool cmp(man a, man b){ if(a.total == b.total) return a.v == b.v ? a.id < b.id : a.v > b.v; return a.total > b.total; } int main(){ int n, l, h; scanf("%d %d %d", &n, &l, &h); vector<man> men[4]; man temp; for(int i = 0; i < n; i++){ scanf("%d %d %d", &temp.id, &temp.v, &temp.t); temp.total = temp.v + temp.t; // 不要忘记给total赋值 if(temp.v >= l && temp.t >= l){ if(temp.v >= h && temp.t >= h) // 圣人 men[0].push_back(temp); else if(temp.v >= h && temp.t < h) // 君子 men[1].push_back(temp); else if(temp.v < h && temp.t < h && temp.v >= temp.t) // 愚人,注意是temp.v >= temp.t men[2].push_back(temp); else // 小人 men[3].push_back(temp); } } printf("%d\n", men[0].size() + men[1].size() + men[2].size() + men[3].size()); for(int i = 0; i < 4; i++){ sort(men[i].begin(), men[i].end(), cmp); for(auto it = men[i].begin(); it != men[i].end(); it++) printf("%d %d %d\n", it->id, it->v , it->t); } return 0; }
-
总结:
-
ID_Number是8位小数,如果用字符串
char id[8]
存ID_Number,最后输出ID_Number后面会有个大写字母,不知道是怎么回事。换成int后输出正常; -
"fool man"的定义是“virtue not lower than talent”,所以应该是
temp.v >= temp.t
,而不是小于号; -
细节:
- 因为
temp.total
要另外算,所以忘记了temp.total = temp.v + temp.t;
。
- 因为
-
【PAT】1062 Talent and Virtue (25 分)
最新推荐文章于 2021-08-16 11:55:46 发布