1080. Graduate Admission (30)
2015-11-24 18:50
507 查看
1.注意排名,在总分数和各个分数相同的情况下,排名必须相同
2.注意录取,学校记录一个最后录取学生的排名,当学校没有名额后,判断这个排名和当前申请的学生排名是否相等,如果相等,则必须录取这个学生
2.注意录取,学校记录一个最后录取学生的排名,当学校没有名额后,判断这个排名和当前申请的学生排名是否相等,如果相等,则必须录取这个学生
//#include<string> //#include <iomanip> //#include<stack> //#include<unordered_set> //#include <sstream> //#include "func.h" //#include <list> #include<unordered_map> #include<set> #include<queue> #include<map> #include<vector> #include <algorithm> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> #include<stack> using namespace std; struct StudentNode{ int Ge, Gi; int totalGrade; int rank; int id; vector<int> choice; StudentNode() :Ge(0), Gi(0), totalGrade(0), rank(-1), id(-1), choice(0){}; StudentNode(int x) :Ge(0), Gi(0), totalGrade(0), rank(-1), id(-1), choice(vector<int>(x,0)){}; }; struct SchoolNode{ int quato; int lastRank; vector<int> student; SchoolNode() :quato(0), lastRank(0), student(0){}; }; bool cmp(const StudentNode&a, const StudentNode&b) { if (a.totalGrade > b.totalGrade) return true; else if (a.totalGrade == b.totalGrade && a.Ge > b.Ge) return true; else return false; } int main(void) { int studentSum, schoolSum, choiceSum; cin >> studentSum >> schoolSum >> choiceSum; vector<StudentNode> student(studentSum, StudentNode(choiceSum)); vector<SchoolNode> school(schoolSum); for (int i = 0; i < school.size(); i++) {//输入每个学校的招生名额 scanf("%d", &school[i].quato); } for (int i = 0; i < student.size(); i++) {//输入学生信息 scanf("%d %d", &student[i].Ge, &student[i].Gi); for (int j = 0; j < choiceSum; j++) {//输入志愿 scanf("%d", &student[i].choice[j]); } student[i].totalGrade = student[i].Ge + student[i].Gi; student[i].id = i; } sort(student.begin(), student.end(), cmp); student[0].rank = 0; for (int i = 1; i < student.size(); i++) {//统计学生的排名 if (student[i].totalGrade == student[i - 1].totalGrade && student[i].Ge == student[i - 1].Ge) student[i].rank = student[i - 1].rank;//所有成绩相等的学生排名一样 else student[i].rank = i; } for (int i = 0; i < student.size(); i++) { for (int j = 0; j < student[i].choice.size(); j++) { int num = student[i].choice[j]; if (school[num].quato > 0 || (school[num].quato == 0 && school[num].lastRank == student[i].rank)) {//还有名额,或者,没有名额但是学校招收的最后一名的排名和当前学生排名一样,需要同样招收 if (school[num].quato>0) school[num].quato--; school[num].lastRank = student[i].rank;//更新学校招收学生的排名 school[num].student.push_back(student[i].id);//压入学生的id break;//学生被录取了,不再遍历后面的志愿 } } } for (int i = 0; i < school.size(); i++) { sort(school[i].student.begin(), school[i].student.end());//对学生的id进行排序 for (int j = 0; j < school[i].student.size(); j++) { printf("%d", school[i].student[j]); if (j != school[i].student.size() - 1) printf(" "); } printf("\n"); } return 0; }
相关文章推荐
- 5分钟学会怎样提升网站用户体验及优化方法
- [2101]:A + B Problem Too
- 安利一款软件-FolderSize
- 实现UITableView上View的上拉隐藏下拉出现效果(1)(category)
- 1080. Graduate Admission (30)
- centos下怎样安装pip
- Linux学习笔记2-----Linux OS的文件目录
- 对带头结点的单链表的简单操作
- 7种文件类型的创建与删除(系统调用)
- Oracle11g非图形化界面linux系统下静默安装
- 破解完VisualAssist后VisualStudio打不开了的解决办法
- iOS 关于枚举的使用
- NXP+FSL=400亿市值,真的现实么?
- JavaScript学习之路10_箭头函数
- ZOJ3319 DP 通过入度出度判非法情况
- [leetcode] 224. Basic Calculator
- Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据
- 下拉刷新--第三方开源--PullToRefresh
- php7 vs HHVM
- OpenCV人形检测Hog