最近重新开始学C/C++,还是很不熟练。
这个题目思路不难,但是提交后显示测试点4段错误,目前还没找到问题出在哪里,希望有好心人帮忙解答。
题目:
Sample Input:
11 6 3
2 1 2 2 2 3
100 100 0 1 2
60 60 2 3 5
100 90 0 3 4
90 100 1 2 0
90 90 5 1 3
80 90 1 0 2
80 80 0 1 2
80 80 0 1 2
80 70 1 3 2
70 80 1 2 3
100 100 0 2 4
Sample Output:
0 10
3
5 6 7
2 8
1 4
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student{
int eGrade, iGrade, sum, Rank, id;
int choice[6];
};
bool cmp(student a, student b){
if(a.sum != b.sum){
return a.sum > b.sum;
}else{
return a.eGrade > b.eGrade;
}
}
int main(){
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
student stu[n];
int school[m][2] = {}; //第一栏记录剩余录取人数,第二栏记录最后一人排名
int output[m][40010] = {}; //输出,第一列是当前录取人数,后面以此存放学号
for(int i = 0; i < m; i++){
scanf("%d", &school[i][0]);
output[i][1] = -1;//已录取人数初始化为-1
}
//读入学生信息
for(int i = 0; i < n; i++){
scanf("%d%d", &stu[i].eGrade, &stu[i].iGrade);
stu[i].id = i;
stu[i].sum = stu[i].eGrade + stu[i].iGrade;
for(int j = 0; j < k; j++){
scanf("%d", &stu[i].choice[j]);
}
}
//按分数排序,记录排名
sort(stu, stu+n, cmp);
stu[0].Rank = 1;
for(int i = 1; i < n; i++){
if(stu[i].sum == stu[i-1].sum && stu[i].eGrade == stu[i-1].eGrade){
stu[i].Rank = stu[i-1].Rank;
}else{
stu[i].Rank = i + 1;
}
}
//按排名顺次录取
for(int i = 0; i < n; i++){
for(int j = 0; j < k; j++){
int schoolNo = stu[i].choice[j];
int leftNum = school[schoolNo][0];
if(leftNum != 0){
school[schoolNo][0]--;
school[schoolNo][1] = stu[i].Rank;
output[schoolNo][0]++;
int weizhi = output[schoolNo][0];
output[schoolNo][weizhi] = stu[i].id;
break;
}else if(stu[i].Rank == school[schoolNo][1]){
output[schoolNo][0]++;
int weizhi = output[schoolNo][0];
output[schoolNo][weizhi] = stu[i].id;
break;
}
}
}
//按照id从小到大的顺序输出每个学校的录取情况
for(int i = 0; i < m; i++){
if(output[i][0]){
sort(output[i]+1, output[i]+output[i][0]+1);
for(int j = 1; j <= output[i][0]; j++){
printf("%d", output[i][j]);
if(j != output[i][0]){
printf(" ");
}else{
printf("\n");
}
}
}else{
printf("\n");
}
}