PAT A1062 Talent and Virtue(同B 1015)

本文深入解析了一道算法竞赛题目,详细介绍了如何通过多种数据结构和排序算法筛选并分类人才,根据特定条件对人才进行排序输出,展示了两种不同的实现思路及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
wordmeaning
outweighs比…重 >
with respect to关于, 至于
tie相等
  • 分析:
    司马缸把人分成这几类,只有talent值和virtue值都达标(≥ L)才参与分类,否则就是不可回收垃圾

合格线:L \ 优秀线:H

peopletalentvirtuenote
sage≥ H≥ H
nobleman< H≥ H
fool man< H< Hv ≥ 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值