PAT 甲级 1012 The Best Rank (25 分)(结构体排序)
题意:
为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语。同时,我们鼓励学生强调自己的最优秀队伍 - 也就是说,
在三个课程和平均成绩的四个职级中,我们打印每个学生的最佳排名。
例如,C,M,E和A - 4名学生的成绩如下:
StudentID C M E A
310101 98 85 88 90
310102 70 95 88 84
310103 82 87 94 88
310104 91 91 91 91
那么所有学生的最佳排名都是第一,因为第一名在C编程语言方面做得最好,而第二名则是数学第二名,英文第三名,平均第三名。
输入
每个输入文件包含一个测试用例。每个案例以包含2个数字N和M(<= 2000)的行开始,
分别是学生人数和学生人数。然后按N行,每个包含一个6位数字的学生ID,其后是C,M和E顺序的该学生的三个整数等级(在[0,100]范围内)。然后在那里是M行,每行包含学生ID
。
输出
对于每个M学生,以一行打印他/她的最佳排名,以及由空格分隔的相应排名的符号。
排名方法的优先级排序为A> C> M> E。因此,如果学生获得相同最佳排名有两种或更多种方式,则输出优先级最高的排名。
如果学生不在评分清单上,只需输出“N / A”即可。
思路:
1.我把ID设置成了String,实际上本来用int也是可以的。这就对判断M个字符串中是否之前又出现过造成了麻烦。对此,我一开始设置的node2结构体里,先给每个排名rank赋值为99999,顺便把字符串放队列里,然后再排序,再遍历队列,如果新来的字符串之前没有出现过,那么它的rank还将是99999,就输出N/A
2.排序弄得我头大,113336,而不是112223,也不是123456。首先本来sort里比较器>=就可以了,偏偏段错误。原因:https://blog.csdn.net/aichirourou_66/article/details/80928249
只好自己弄排序的名次,由此引入了k来存储上一个的名次。j=k,而不是M[a[i-1].s].rank,这个地方粗心损失了不少时间。
3.排序我居然重复写了四遍,实际上放在一个循环里就可以了。。。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{//存放学生信息
string s;
int c;
int ma;
int e;
double av;
}a[];
struct node2//存放rank信息
{
int rank;//排名
char course;//课程
node2(int _rank=,char _course='A')
{
rank=_rank;
course=_course;
}
};
map<string,node2>M;//将ID与rank信息一一对应
queue<string>Q; //用于放后面输入的M个字符串 bool cmp_av(const node &x, const node &y) {
return x.av > y.av;//不能>=,会段错误
}
bool cmp_c(const node &x, const node &y) {
return x.c > y.c;
}
bool cmp_ma(const node &x, const node &y) {
return x.ma > y.ma;
}
bool cmp_e(const node &x, const node &y) {
return x.e > y.e;
}
string ss;
int main()
{
cin>>n>>m;
while(!Q.empty()) Q.pop();
for(int i=;i<=n;i++){
cin>>a[i].s>>a[i].c>>a[i].ma>>a[i].e;
a[i].av=int((a[i].c+a[i].ma+a[i].e)*1.0/+0.5);
M[a[i].s]=node2(,'A');//先给个默认的rank信息
} for(int i=;i<=m;i++)
{
cin>>ss;
Q.push(ss);//先放进去,之后还要再遍历
M[a[i].s]=node2(,'A');//先给个默认的rank信息
}
sort(a+,a++n,cmp_av);
int k=;//为了名次设置的,113336,而不是112223,也不是123456
for(int i=;i<=n;i++)
{
int j=i;
if(i> && a[i].av==a[i-].av){
j=k;//为前面的名词
}
else{
k=j;//名词为j,同时更新k
}
if(M[a[i].s].rank>j){
M[a[i].s].rank=j;
M[a[i].s].course='A';
}
// cout<<j<<" "<<a[i].s<<" "<<a[i].av<<endl;
} sort(a+,a++n,cmp_c);
// cout<<endl;
k=;
for(int i=;i<=n;i++)
{
int j=i;
if(i> && a[i].c==a[i-].c){
j=k;
}
else{
k=j;
}
if(M[a[i].s].rank>j){
M[a[i].s].rank=j;
M[a[i].s].course='C';
}
// cout<<j<<" "<<a[i].s<<" "<<a[i].c<<endl;
} sort(a+,a++n,cmp_ma);
// cout<<endl;
k=;
for(int i=;i<=n;i++)
{
int j=i;
if(i> && a[i].ma==a[i-].ma){
j=k;
}
else{
k=j;
}
if(M[a[i].s].rank>j){
M[a[i].s].rank=j;
M[a[i].s].course='M';
}
// cout<<j<<" "<<a[i].s<<" "<<a[i].ma<<endl;
} sort(a+,a++n,cmp_e);
// cout<<endl;
k=;
for(int i=;i<=n;i++)
{
int j=i;
if(i> && a[i].e==a[i-].e){
j=k;
}
else{
k=j;
}
if(M[a[i].s].rank>j){
M[a[i].s].rank=j;
M[a[i].s].course='E';
}
// cout<<j<<" "<<a[i].s<<" "<<a[i].e<<endl;
}
while(!Q.empty())
{
ss = Q.front();
Q.pop();
//cout<<ss<<" "<<M[ss].rank<<endl;
if(M[ss].rank==){//不存在的情况
cout<<"N/A"<<endl;
}
else{
cout<<M[ss].rank<<" "<<M[ss].course<<endl;
}
}
return ;
}
PAT 甲级 1012 The Best Rank (25 分)(结构体排序)的更多相关文章
- PAT甲级1012. The Best Rank
PAT甲级1012. The Best Rank 题意: 为了评估我们第一年的CS专业学生的表现,我们只考虑他们的三个课程的成绩:C - C编程语言,M - 数学(微积分或线性代数)和E - 英语.同 ...
- 1012 The Best Rank (25分) vector与结构体排序
1012 The Best Rank (25分) To evaluate the performance of our first year CS majored students, we con ...
- PAT甲 1012. The Best Rank (25) 2016-09-09 23:09 28人阅读 评论(0) 收藏
1012. The Best Rank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To eval ...
- PAT 乙级 1085. PAT单位排行 (25) 【结构体排序】
题目链接 https://www.patest.cn/contests/pat-b-practise/1085 思路 结构体排序 要注意几个点 它的加权总分 是 取其整数部分 也就是 要 向下取整 然 ...
- 【PAT】1012. The Best Rank (25)
题目链接: http://pat.zju.edu.cn/contests/pat-a-practise/1012 题目描述: To evaluate the performance of our fi ...
- PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)
1062 Talent and Virtue (25 分) About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...
- PAT 甲级 1056 Mice and Rice (25 分) (队列,读不懂题,读懂了一遍过)
1056 Mice and Rice (25 分) Mice and Rice is the name of a programming contest in which each program ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- PAT 甲级 1083 List Grades (25 分)
1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...
随机推荐
- 数据库连接池,DBUtil的模板,dbcp,c3p0
数据库连接池,DBUtil的模板,Druid使用(重点) 一.DBUtil模板 public class DBUtilTest { public static Connection connectio ...
- vim 操作命令大全
转子:https://www.cnblogs.com/yangjig/p/6014198.html 和 https://blog.csdn.net/u010956473/article/detail ...
- JS 自定义组件
经常会用到JS插件,但从未研究过插件的写法 目前主流的写法有多种,各有各的优缺点,下面,我就以最常规的一种写法举例 // plugin.js ;(function(undefined) {//防止出现 ...
- sublimetext插件自定义respository
官方文档(https://packagecontrol.io/docs/submitting_a_package) 上面说明了插件可以按两种方式挂起,一种是github,一种是ssl认证的web服务器 ...
- HDU 3824/ BZOJ 3963 [WF2011]MachineWorks (斜率优化DP+CDQ分治维护凸包)
题面 BZOJ传送门(中文题面但是权限题) HDU传送门(英文题面) 分析 定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[ ...
- System.Web.HttpRequestValidationException: 从客户端(name="<a href=''>我是晓菜鸟</a>")中检测到有潜在危险的 Request.Form 值
这是一个比较常见的问题了,如果Web表单中有输入类似于 Html 标签之类的文本,在通过 Request.QueryString 或者 Request.Form 传递这些值的时候,就会触发这样的异常, ...
- mybatis 批量删除添加
mybatis使用foreach进行批量插入和删除操作 转发与 https://www.cnblogs.com/Amaris-Lin/p/8615977.html 一.批量插入 1. ...
- Codeforces Round #592 (Div. 2)【C题】{补题ING}
思路:x,y,z肯定不为负数xw+dy=p,直接枚举系数较小的y即可,y的范围:y<w,因为大于w的时候,不如去增加x,这样x+y的和还能保持尽可能小. /* x*w+y*d=p; x*w+(K ...
- focusout([data],fn) 当元素失去焦点时触发 focusout 事件。
focusout([data],fn) 概述 当元素失去焦点时触发 focusout 事件. focusout事件跟blur事件区别在于,他可以在父元素上检测子元素失去焦点的情况.大理石平台怎么样 参 ...
- 数据结构实验之图论八:欧拉回路(SDUT 3364)
Problem Description 在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来. 能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓 ...