PTA 1080 Graduate Admission (30 分)

最近重新开始学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");
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值