Почему не все тестовые случаи пройдены в этом вопросе? - PullRequest
0 голосов
/ 29 мая 2019

Я готовлюсь к завершению программирования и PTA |100 设计 类 实验 辅助 教学 平台 - это вопрос неполного года.

Я провел сравнение с ответом других и до сих пор не знаю, что не так с моим кодом.Код в 1080.Выпускник приема (30) -PAT 甲级 真题 - 柳 婼 の блог проходит все отлично.

Проблема решается в основном с помощью сортировки, и я применил функцию sort.

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

struct Applicant
{
    int G_E; // GE
    int G_T; // GT
    int id;
    int sum; // sum = G_E + G_T
    int appliedSchools[7];
    int rank;
};

struct School
{
    int num = 0;
    int admitedApplicants[40010];
};

bool cmp (struct Applicant School_A, struct Applicant School_B)
{
    if (School_A.sum != School_B.sum)
        return School_A.sum > School_B.sum;
    else
        return School_A.G_E > School_B.G_E;
}

bool cmpID(int A, int B)
{
    if (A != B)
        return A < B;
}

int quotaOfGraduateSchools[100];
struct Applicant applicants[40000];

int main ()
{
    int N, M, K;
    scanf("%d %d %d", &N, &M, &K);

    for (int i = 0; i < M; ++i)
        scanf("%d", &quotaOfGraduateSchools[i]);

    for (int i = 0; i < N; ++i)
    {
        scanf("%d %d ", &applicants[i].G_E, &applicants[i].G_T);
        applicants[i].sum = applicants[i].G_E + applicants[i].G_T;
        applicants[i].id = i;
        for (int j = 0; j < K; ++j)
            scanf("%d", &applicants[i].appliedSchools[j]);
    }

    sort(applicants, applicants + N, cmp);
    applicants[0].rank = 1;
    for (int i = 1; i < N; ++i)
    {
        if (applicants[i].sum == applicants[i-1].sum && applicants[i].G_E == applicants[i-1].G_E)
            applicants[i].rank = applicants[i-1].rank;
        else
            applicants[i].rank = i + 1;
    }

    struct School schools[M];

//  for (int i = 0; i < N; ++i)
//      printf("Rank = %d, ID = %d, school_1 = %d, school_2 = %d, school_3 = %d\n", applicants[i].rank, applicants[i].id, applicants[i].appliedSchools[0], applicants[i].appliedSchools[1], applicants[i].appliedSchools[2]);

    for (int i = 0; i < N; ++i)
    {
        for (int j = 0; j < K; ++j)
        {
            if (schools[applicants[i].appliedSchools[j]].num < quotaOfGraduateSchools[applicants[i].appliedSchools[j]])
            {
                schools[applicants[i].appliedSchools[j]].admitedApplicants[schools[applicants[i].appliedSchools[j]].num] = applicants[i].id;
                ++schools[applicants[i].appliedSchools[j]].num;
                break;
            }
            else if (schools[applicants[i].appliedSchools[j]].num > 0 && applicants[schools[applicants[i].appliedSchools[j]].admitedApplicants[schools[applicants[i].appliedSchools[j]].num - 1]].rank == applicants[i].rank)
            {
                schools[applicants[i].appliedSchools[j]].admitedApplicants[schools[applicants[i].appliedSchools[j]].num] = applicants[i].id;
                ++schools[applicants[i].appliedSchools[j]].num;
                break;
            }
            else
                continue;
        }
    }

    for (int i = 0; i < M; ++i)
    {
        if (schools[i].num == 0)
            printf("\n");
        else
        {
            sort(schools[i].admitedApplicants, schools[i].admitedApplicants + schools[i].num, cmpID);
            printf("%d", schools[i].admitedApplicants[0]);
            for (int j = 1; j < schools[i].num; ++j)
                printf(" %d", schools[i].admitedApplicants[j]);
            printf("\n");
        }
    }

    return 0;
}

1 Ответ

0 голосов
/ 29 мая 2019

cmpID функция не возвращает ничего, если идентификаторы равны -> неопределенное поведение.Включите предупреждения вашего компилятора.

Не смешивайте два языка, struct Applicant School_A - это C, в C ++ это просто Applicant School_A, а для IO есть cout и cin.Я не сторонник 80 столбцов шириной символов, но я все равно рекомендую рефакторинг.Просто что-то маленькое, например auto& appliedSchoolI = applicants[i].appliedSchools[j]; auto& appliedSchool = schools[appliedSchoolI];..., очень помогло бы в этих операторах if:

...