PAT A1062 Talent and Virtue(同B 1015)
Sample Input:
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
Sample Output:
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
word | meaning |
---|---|
outweighs | 比…重 > |
with respect to | 关于, 至于 |
tie | 相等 |
- 分析:
司马缸把人分成这几类,只有talent值和virtue值都达标(≥ L)才参与分类,否则就是不可回收垃圾
合格线:L \ 优秀线:H
people | talent | virtue | note |
---|---|---|---|
sage | ≥ H | ≥ H | |
nobleman | < H | ≥ H | |
fool man | < H | < H | v ≥ t |
small man | ≥ L | ≥ L | 不满足上述三种 |
-
思路1:
输入时通过if_else筛选出各类人,并统计合格的人cnt,用4个vector存储这4类人,再按要求 ( 1.总分非增 \ 2.总分同,virtue分非增 \ 3.还同,ID递增)排序输出 -
code1:
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n, l, h;
const int maxn = 100100;
struct stu{
int id, virtue, talent;
}s[maxn];
vector<stu> sta[3];
bool cmp(stu s1, stu s2){
if((s1.virtue + s1.talent) != (s2.virtue + s2.talent))
return (s1.virtue + s1.talent) > (s2.virtue + s2.talent);
else if(s1.virtue != s2.virtue)
return s1.virtue > s2.virtue;
else
return s1.id < s2.id;
}
int main(){
scanf("%d%d%d", &n, &l, &h);
int cnt = n;
for(int i = 0;i < n; ++i){
scanf("%d%d%d", &s[i].id, &s[i].virtue, &s[i].talent);
if(s[i].virtue >= l && s[i].talent >= l){
if(s[i].virtue >= h && s[i].talent >= h){
sta[0].push_back(s[i]);
}else if(s[i].virtue >= h && s[i].talent < h){
sta[1].push_back(s[i]);
}else if(s[i].virtue < h && s[i].talent < h && s[i].virtue >= s[i].talent){
sta[2].push_back(s[i]);
}else{
sta[3].push_back(s[i]);
}
}else{
cnt--;
}
}
sort(sta[0].begin(), sta[0].end() , cmp);
sort(sta[1].begin(), sta[1].end() , cmp);
sort(sta[2].begin(), sta[2].end() , cmp);
sort(sta[3].begin(), sta[3].end() , cmp);
printf("%d\n", cnt);
for(int i = 0; i < 4; ++i){
for(int j = 0; j < sta[i].size(); ++j){
printf("%d %d %d\n", sta[i][j].id, sta[i][j].virtue, sta[i][j].talent);
}
}
return 0;
}
-
思路2:
在结构体中定义其所属的类别变量,排序的时候把这个变量加进去 -
T2 code:
#include <bits/stdc++.h>
using namespace std;
struct Peo{
int id, v, t, total;
Peo(int _id, int _v, int _t, int _total) : id(_id), v(_v), t(_t), total(_total){}
};
vector<Peo> P[6];
bool cmp(Peo a, Peo b){
if(a.total != b.total) return a.total > b.total;
else if(a.v != b.v) return a.v > b.v;
else return a.id < b.id;
}
int main(){
int n, l, h, cnt = 0;
scanf("%d %d %d", &n, &l, &h);
for(int i = 0; i < n; ++i){
int id, v_score, t_score;
scanf("%d %d %d", &id, &v_score, &t_score);
Peo tmp = Peo(id, v_score, t_score, v_score+t_score);
if(v_score >= l && t_score >= l){
if(v_score >= h && t_score >= h){
P[0].push_back(tmp);
}else if(v_score >= h && t_score < h){
P[1].push_back(tmp);
}else if(v_score < h && t_score < h && v_score >= t_score){
P[2].push_back(tmp);
}else{
P[3].push_back(tmp);
}
cnt++;
}
}
printf("%d\n", cnt);
for(int i = 0; i < 4; ++i){
sort(P[i].begin(), P[i].end(), cmp);
for(int j = 0; j < P[i].size(); ++j){
printf("%08d %d %d\n", P[i][j].id, P[i][j].v, P[i][j].t);
}
}
return 0;
}
- T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct Peo
{
int id, vg, tg, sign;
};
vector<Peo> ans;
bool cmp(Peo a, Peo b)
{
int ta = a.vg + a.tg, tb = b.vg + b.tg;
if(a.sign != b.sign) return a.sign > b.sign;
else if(ta != tb) return ta > tb;
else if(a.vg != b.vg) return a.vg > b.vg;
else return a.id < b.id;
}
int main()
{
int n, L, H;
scanf("%d %d %d", &n, &L, &H);
for(int i = 0; i < n; ++i)
{
int tid, tvg, ttg, tsign;
scanf("%d %d %d", &tid, &tvg, &ttg);
if(tvg < L || ttg < L) continue;
if(tvg >= H && ttg >= H) tsign = 4;
else if(ttg < H && tvg >= H) tsign = 3;
else if(ttg < H && tvg >= ttg) tsign = 2;
else tsign = 1;
ans.push_back(Peo{tid, tvg, ttg, tsign});
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); ++i)
{
printf("%08d %d %d\n", ans[i].id, ans[i].vg, ans[i].tg);
}
return 0;
}