1062 Talent and Virtue
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1062 Talent and Virtue相关的知识,希望对你有一定的参考价值。
1.在结构体里面设置total_grades属性是明智之举,但是不可以在结构体内得到total_grades=virtue_grade+talent_grade;
2.弄清题意,对人进行分类,等级越高type值越小,但是注意分的类别也许出现交叉的情况,细的要出现在粗的之后
3.尤其注意要被淘汰的选手,一旦淘汰要直接进入下一轮循环,否则可能因为type被覆盖而被误捞回来。例如:60分的最低分,有人v=90,t=50,本该淘汰,却可能被接下来的判断认为是君子
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct person{
char id[10] = "";
int virtue_grade = 0;
int talent_grade = 0;
int total_grades = 0;
int type = 0;//属于哪类人,虽然我不喜欢把人分类
}pers[maxn];
bool cmp(person a,person b){
if(a.type!=b.type)return a.type<b.type;
else if(a.total_grades!=b.total_grades) return a.total_grades>b.total_grades;
else if(a.virtue_grade!=b.virtue_grade)return a.virtue_grade>b.virtue_grade;
else if(a.talent_grade!=b.talent_grade)return a.talent_grade>b.talent_grade;
else return strcmp(a.id,b.id)<0;
}
// v,t >= H 圣人 0
// t<H v>=H 君子 1
// v,t<=H v>=t 愚人 2
// v,t>=L 3
// v<L or t<L 不录 4
int main(){
int n,L,H;
scanf("%d %d %d",&n,&L,&H);
int idx = 0;
char now_id[10] = "";
int v = 0;
int t = 0;
int now_type = 5;
while(n--){
scanf("%s %d %d",now_id,&v,&t);
if(v<L||t<L){
now_type = 4;
continue;//4可能被3,2,1覆盖掉,很危险,一定要跳出循环
}
if(v>=L&&t>=L)now_type = 3;//可能被 2 1 0 覆盖掉
if(v<=H&&t<=H&&v>=t)now_type = 2;
if(t<H&&v>=H)now_type = 1;
if(v>=H&&t>=H)now_type = 0;
if(now_type!=4){
strcpy(pers[idx].id,now_id);
pers[idx].virtue_grade = v;
pers[idx].talent_grade = t;
pers[idx].total_grades = v+t;
pers[idx].type = now_type;
idx ++;
}
}
printf("%d\\n",idx);
sort(pers,pers+idx,cmp);
for(int i=0;i<idx;i++){
printf("%s %d %d\\n",pers[i].id,pers[i].virtue_grade,pers[i].talent_grade);
}
return 0;
}
以上是关于1062 Talent and Virtue的主要内容,如果未能解决你的问题,请参考以下文章
PAT-B 1015. 德才论(同PAT 1062. Talent and Virtue)
1062. Talent and Virtue (25)排序——PAT (Advanced Level) Practise