PAT 1080 Graduate Admission
来源:互联网 发布:linux 复制目录及文件 编辑:程序博客网 时间:2024/06/06 01:27
这道题很简单,但是做了很久。这里想贴两个版本,第一个是不完全正确的,但是仍然想保留下来提醒自己注意留意容易忽略的小细节!
总结一下出错的地方,首先是要注意保留学生id,然后要注意在录取环节千万不要把循环变量i当做学生id。个人感觉保存学生rank比保存未排序的stu要好,不容易出错。
#include <algorithm>#include <iostream>#include <stdio.h>#include <vector>using namespace std;#define MAXN 40000#define MAXM 100struct Stu{ int id;//记录学生最初编号 int ge; int gi; int final; int choice[6]; bool operator <(const Stu &b) const{ if(final!=b.final) return final>b.final; else return ge>b.ge; }}stu[MAXN];struct School{ vector<int> stu; int quota;}sch[MAXM];int main(){ int n,m,k; //freopen("/Users/pantingting/Documents/code/data/input", "r", stdin); scanf("%d%d%d",&n,&m,&k); for (int i=0; i<m; i++) { scanf("%d",&sch[i].quota);//读取每个学校的指标 } for (int i=0; i<n; i++) {//读取学生成绩并排序 scanf("%d%d",&stu[i].ge,&stu[i].gi); stu[i].final=(stu[i].ge+stu[i].gi); for (int j=0; j<k; j++) {//读取学生志愿 scanf("%d",&stu[i].choice[j]); } stu[i].id=i;//记录学生的初始编号 } sort(stu, stu+n); for (int i=0; i<n; i++) {//i为学生排序后的编号,j为学生i的志愿编号 for (int j=0; j<k; j++) {//按照志愿顺序检查学校是否已经招满。 int schid=stu[i].choice[j]; if (sch[schid].quota==0) {//若该校招生指标为0则略过 continue; } if (sch[schid].stu.size()<sch[schid].quota) //该校未招满,则收录该生 { sch[schid].stu.push_back(stu[i].id);//记录的是学生原来的id,而不是排序后的 break; } else//该校已经招满了,或者chao额了,必须录取所有同rank的学生。 { int last=sch[schid].stu[sch[schid].stu.size()-1];//取出最后一名学生的编号,这个编号是实际号 if(stu[last].final==stu[i].final&&stu[last].ge==stu[i].ge)//若为tie则可以超额录取 { sch[schid].stu.push_back(stu[i].id); break; } } } } for (int i=0; i<m; i++) { if (sch[i].stu.size()==0) {//若该校无学生则输出空行、 printf("\n"); } else sort(sch[i].stu.begin(), sch[i].stu.end());//对结果进行排序 for (int j=0; j<sch[i].stu.size(); j++) { printf("%d",sch[i].stu[j]); if (j!=sch[i].stu.size()-1) { printf(" ");//最后一个id后面不能有空格 } else printf("\n"); } } return 0;}
修改后的代码(通过全部case)
#include <algorithm>#include <iostream>#include <stdio.h>#include <vector>using namespace std;#define MAXN 40000#define MAXM 100struct Stu{ int id;//记录学生最初编号 int ge; int gi; int final; int choice[6]; int rank; bool operator <(const Stu &b) const{ if(final!=b.final) return final>b.final; else return ge>b.ge; }}stu[MAXN];struct School{ vector<int> stu; int quota; int lastrank;//记录该校最后一名学生的rank;}sch[MAXM];int main(){ int n,m,k; // freopen("/Users/pantingting/Documents/code/data/input", "r", stdin); scanf("%d%d%d",&n,&m,&k); for (int i=0; i<m; i++) { scanf("%d",&sch[i].quota);//读取每个学校的指标 } for (int i=0; i<n; i++) {//读取学生成绩并排序 scanf("%d%d",&stu[i].ge,&stu[i].gi); stu[i].final=(stu[i].ge+stu[i].gi); for (int j=0; j<k; j++) {//读取学生志愿 scanf("%d",&stu[i].choice[j]); } stu[i].id=i;//记录学生的初始编号 } sort(stu, stu+n); stu[0].rank=0;//给每个学生计算排名 for (int i=1; i<n; i++) { if (stu[i].final==stu[i-1].final&&stu[i].ge==stu[i-1].ge) { stu[i].rank=stu[i-1].rank; } else stu[i].rank=i; } for (int i=0; i<n; i++) {//i为学生排序后的编号,j为学生i的志愿编号 for (int j=0; j<k; j++) {//按照志愿顺序检查学校是否已经招满。 int schid=stu[i].choice[j]; if (sch[schid].quota==0) {//若该校招生指标为0则略过 continue; } if (sch[schid].stu.size()<sch[schid].quota) //该校未招满,则收录该生 { sch[schid].stu.push_back(stu[i].id);//记录的是学生原来的id,而不是排序后的 sch[schid].lastrank=stu[i].rank; break; } else//该校已经招满了,或者chao额了,必须录取所有同rank的学生。 { /*int last=sch[schid].stu[sch[schid].stu.size()-1];//取出最后一名学生的编号,这个编号是实际编号,若想取得该生的成绩,应该从原来未排序的stu中取得。 if(stu[last].final==stu[i].final&&stu[last].ge==stu[i].ge)//若为tie则可以超额录取 { sch[schid].stu.push_back(stu[i].id); break; }*/ if (sch[schid].lastrank==stu[i].rank) { sch[schid].stu.push_back(stu[i].id); break; } } } } for (int i=0; i<m; i++) { if (sch[i].stu.size()==0) { printf("\n"); } else sort(sch[i].stu.begin(), sch[i].stu.end());//对结果进行排序 for (int j=0; j<sch[i].stu.size(); j++) { printf("%d",sch[i].stu[j]); if (j!=sch[i].stu.size()-1) { printf(" ");//最后一个id后面不能有空格 } else printf("\n"); } } return 0;}
0 0
- PAT 1080 Graduate Admission
- PAT 1080Graduate Admission
- pat 1080 Graduate Admission
- PAT 1080-Graduate Admission (30)
- Pat(Advanced Level)Practice--1080(Graduate Admission)
- 【PAT】1080. Graduate Admission
- PAT 1080. Graduate Admission (30)
- PAT 1080. Graduate Admission (30)
- PAT 1080. Graduate Admission (30)
- 【PAT】1080. Graduate Admission (30)
- 1080. Graduate Admission (30) PAT
- PAT 1015Graduate Admission (30)
- pat-1080. Graduate Admission (30)
- pat-A1080. Graduate Admission (30)
- PAT A1080. Graduate Admission (30)
- PAT A1080 graduate admission (30)
- PAT A1080. Graduate Admission (30)
- PAT (Advanced Level) Practise 1080 Graduate Admission (30)
- poj 3070 Fibonacci
- Project Management Life Cycle-Predictive & Iterative & Adaptive
- HDU 3584 Cube
- Single Number II
- HDU 2519 组合数基础
- PAT 1080 Graduate Admission
- PAT (Basic Level) Practise (中文) 1026. 程序运行时间(15)
- codeforces 107C Arrangement (状压dp)
- 【Uva 232】 Crossword Answers
- POJ 3169 Layout(差分约束基础)
- HDU 5176 The Experience of Love(带权并查集)
- 第三方应用分享到微信朋友圈功能
- LPC2138编程时出现错误“Timer.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAS
- java软件复杂运算,同时显示进度条的一种方法