1 条题解
-
0
C :
#include <stdio.h> #define equal(a, b) (grades[a][0] == grades[b][0])&&(grades[a][1] == grades[b][1]) int cap[100], rank[40000], grades[40000][10] = { 0 }, acc[100][40000]; int n, m, k; void RankG() { int i, j, k, flags, t, p, q; for(i = 0; i < n; i++) for (j = i + 1; j < n; j++) { flags = 0; p = rank[i]; q = rank[j]; if (grades[p][0] < grades[q][0]) { flags = 1; } else if((grades[p][0] == grades[q][0])&&(grades[p][1]<grades[q][1])) { flags = 1; } if (flags) { t = rank[i]; rank[i] = rank[j]; rank[j] = t; } } } void buble(int as[], int ns) { int i, j, t; for(i = 1; i < ns; i++) for (j = i + 1; j <= ns; j++) { if (as[i] > as[j]) { t = as[i]; as[i] = as[j]; as[j] = t; } } } int main() { int i, j, index, school; while (scanf("%d %d %d", &n, &m, &k) != EOF) { for (i = 0; i < m; i++) { scanf("%d", &cap[i]); acc[i][0] = 0; } for (i = 0; i < n; i++) { rank[i] = i; for (j = 1; j < k + 3; j++) scanf("%d", &grades[i][j]); grades[i][0] = grades[i][1] + grades[i][2]; } RankG(); for (i = 0; i < n; i++) { index = rank[i]; for (j = 3; j < k + 3; j++) { school = grades[index][j]; if (cap[school] > acc[school][0]) { acc[school][0]++; acc[school][acc[school][0]] = index; break; } else if(equal(acc[school][acc[school][0]], index)) { acc[school][0]++; acc[school][acc[school][0]] = index; break; } } } for (i = 0; i < m; i++) { buble(acc[i], acc[i][0]); for (j = 1; j <= acc[i][0]; j++) { printf("%d", acc[i][j]); if (j < acc[i][0])printf(" "); } printf("\n"); } } }
C++ :
#include <cstdio> #include <algorithm> using namespace std; // 定义每个考生的信息结构 struct StuType{ double ge, gi, a; // 统考分数、面试分数,以及均分 int id; // 考生的序号 int s[5]; // 考生选择的学校(最多 5 个) }; // 定义比较函数,用来对考生信息进行排序 bool cmp(StuType a, StuType b){ if(a.a == b.a){ // 如果均分相同 return a.ge > b.ge; // 则比较统考分数 } return a.a > b.a; // 否则比较均分 } int schools[110][44000]; // 记录学校招收的考生序号 StuType students[44000]; // 记录所有的考生信息 int main(){ int n; while(scanf("%d",&n) != EOF){ // 读取考生数目 int m, k; scanf("%d%d", &m, &k); // 读取学校数目以及考生可选学校的数目 int numOfSchool[110]; // 存储每个学校能够招收考生的数目 for(int i=0;i<m;i++){ scanf("%d",&numOfSchool[i]); // 读取每个学校能够招收考生的数目 } for(int i=0;i<n;i++){ scanf("%lf%lf", &students[i].ge, &students[i].gi); // 读取考生统考成绩以及面试成绩 students[i].a = (students[i].ge+students[i].gi)/2; // 计算统考成绩和面试成绩的均分 for(int j=0;j<k;j++){ scanf("%d",&students[i].s[j]); // 读入考生选取的学校序号 } students[i].id = i; // 记录考生的序号 } sort(students, students+n, cmp); // 按先均分后统考分数的顺序进行排序 int numOfSche[110] = {0}; // 记录每个学校已经招收的考生 double gradeOfLast[110][2]; // 如果需要扩招的话,记录扩招时需要的均分和统考分数, // 因为只有均分和统考分数不小于(实际上是相等)扩招时才能够被扩招 for(int i=0;i<n;i++){ // 对每个考生进行遍历 for(int p=0;p<k;p++){ // 遍历考生选择的每个学校 int j = students[i].s[p]; // 获得考生选择学校的编号 if(numOfSche[j]<numOfSchool[j]){ // 判断目前该学校是否招生已满,如果没满,则招收之 schools[j][numOfSche[j]++] = students[i].id; // 记录学校招收考生的序号 if(numOfSche[j] == numOfSchool[j]){ // 如果正好招生已满, gradeOfLast[j][0] = students[i].a; // 则记录最后一个考生的均分 gradeOfLast[j][1] = students[i].ge; // 以及统考分 } break; // 注意,一旦考生被选择的某个学校录取了,后面的学校就不能再录取了 }else if(students[i].a==gradeOfLast[j][0] && students[i].ge==gradeOfLast[j][1]){ // 如果招生已满,则判断该考生的均分和统考分是否与最后一名相同,如果相同则应当扩招进来 schools[j][numOfSche[j]++] = students[i].id; // 记录学校招收考生的序号 break; } } } for(int i=0;i<m;i++){ // 将学校的考生信息输出 sort(schools[i], schools[i]+numOfSche[i]); // 注意要求按考生序号递增输出 for(int j=0;j<numOfSche[i];j++){ if(j){ // 除了第一个考生序号前面不需要输出空格,后面的需要前面都需要输出一个空格 putchar(' '); } printf("%d",schools[i][j]); // 输出考生序号 } putchar('\n'); } } return 0; }
- 1
信息
- ID
- 1877
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者