PAT 1012. The Best Rank (25)
2015-07-10 15:24
393 查看
不得不写的1012,一把辛酸泪。
正常模拟排序之后中间两个一直过不了,然后看了别人的博客,发现问题:
1.并列排名问题没有考虑,然后再改改,发现依然没有过。
2.平均数是+0.5之后的整数,然后依旧没过。
最后我发现我傻帽的地方,考虑并列排名时居然用判断处理之后的了,已经哭瞎了,最后终于过了!
正常模拟排序之后中间两个一直过不了,然后看了别人的博客,发现问题:
1.并列排名问题没有考虑,然后再改改,发现依然没有过。
2.平均数是+0.5之后的整数,然后依旧没过。
最后我发现我傻帽的地方,考虑并列排名时居然用判断处理之后的了,已经哭瞎了,最后终于过了!
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<string> using namespace std; struct p { string StudentID; int grade_C,grade_M,grade_E; int grade_A; }student[20005]; bool cmp_gradeC(p x,p y) { return x.grade_C > y.grade_C; } bool cmp_gradeM(p x,p y) { return x.grade_M > y.grade_M; } bool cmp_gradeE(p x,p y) { return x.grade_E > y.grade_E; } bool cmp_gradeA(p x,p y) { return x.grade_A > y.grade_A; } int main() { int n,m; while(cin>>n>>m) { map<string,int> rank; map<string,char> courses; for(int i = 0; i < n; i++) { cin>>student[i].StudentID>>student[i].grade_C>>student[i].grade_M>>student[i].grade_E; student[i].grade_A = (int)((student[i].grade_C + student[i].grade_E + student[i].grade_M)/3.0 + 0.5); } sort(student,student+n,cmp_gradeA); int grade = -1,ranks = 0; for(int i = 0; i < n; i++) { if(student[i].grade_A != grade) { ranks = i+1; } grade = student[i].grade_A; rank[student[i].StudentID] = ranks; courses[student[i].StudentID] = 'A'; } sort(student,student+n,cmp_gradeC); grade = -1; ranks = 0; for(int i = 0; i < n; i++) { if(student[i].grade_C != grade)//一直不过的原因是让i和i-1比较,然后使用了i-1的排名(rank的,而不是本次排序的!) ranks = i+1; grade = student[i].grade_C; if(ranks < rank[student[i].StudentID]) { rank[student[i].StudentID] = ranks; courses[student[i].StudentID] = 'C'; } } sort(student,student+n,cmp_gradeM); grade = -1; ranks = 0; for(int i = 0; i < n; i++) { if(student[i].grade_M != grade) ranks = i+1; grade = student[i].grade_M; if(ranks < rank[student[i].StudentID]) { rank[student[i].StudentID] = ranks; courses[student[i].StudentID] = 'M'; } } sort(student,student+n,cmp_gradeE); grade = -1; ranks = 0; for(int i = 0; i < n; i++) { if(student[i].grade_E != grade) ranks = i+1; grade = student[i].grade_E; if(ranks < rank[student[i].StudentID]) { rank[student[i].StudentID] = ranks; courses[student[i].StudentID] = 'E'; } } for(int i = 0; i < m; i++) { string id; cin>>id; map<string ,int>::iterator l_it; l_it = rank.find(id); if(l_it == rank.end()) { cout<<"N/A"<<endl; }else { cout<<rank[id]<<' '<<courses[id]<<endl; } } } return 0; }
相关文章推荐
- Enea公司----OSE/OSEck RTOS --2
- 在android程序中使用配置文件properties
- linux中的通配符、元字符、转义符
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- 动态调用Webservice 支持Soapheader身份验证(转)
- GRE写作必备句型
- Samba服务器配置 (REDHAT6.4)
- cmake下载安装
- CSS3动画那么强,requestAnimationFrame还有毛线用。
- UITableViewCell复用机制
- 【Android Studio快捷键】之代码提示
- 7.10省队集训梦工厂
- java非阻塞nio例子
- 设置layer.cornerRadius后变卡怎么解决
- 魅补丁-系列插件
- 视频会议政府行业应用
- VC++ 把窗口带到最前
- 深入浅出SQL读书笔记
- .net mvc 利用cookie实现自动登录 退出后注销信息
- uniq命令