1095 디 코딩 PAT 수험표 (25 점) PAT 을 급 진제

1095 디 코딩 PAT 수험표 (25 점)
PAT 수험 번 호 는 4 부분 으로 구성 되 어 있 습 니 다. · 1 위 는 등급, 즉 T 는 최고급 을 대표 합 니 다.A 대표 갑 급;B 는 을 급 을 대표 한다.2 ~ 4 위 는 시험장 번호 로 101 에서 999 까지 범위 가 넓 습 니 다.5 ~ 10 위 는 시험 날짜 로 연, 월, 일 순 으로 각각 2 위 를 차지한다.마지막 11 ~ 13 명 은 수험생 번호 로 범위 가 000 에서 999 까지 이다.현재 일련의 수험생 의 수험표 번호 와 그들의 성적 을 정 하고 있 으 니, 요구 에 따라 각종 통계 정 보 를 출력 해 주 십시오.
입력 형식: 입력 은 먼저 한 줄 에 두 개의 정수 N (≤ 1 0 4) 을 입력 하고 먼저 한 줄 에 두 개의 정수 N (≤ 10 ^ {4}) 을 입력 하 며 먼저 한 줄 에 두 개의 정수 N (≤ 10 4) 과 M (≤ 100) 을 제시 하여 각각 수험생 수 와 통계 요구 의 개 수 를 제시한다.이 어 N 행 은 각 행 별로 수험생 의 수험 번호 와 그 점수 (구간 [0, 100] 내 정수) 를 주 고 그 사이 빈 칸 으로 구분한다.수험생 정 보 를 제공 한 후에 M 줄 을 제시 하고 각 줄 은 하나의 통계 요 구 를 제시한다. 형식 은 유형 지령 이다. 그 중에서 유형 은 1 로 특정한 등급 의 수험생 의 성적 을 점수 비 오름차 순 으로 출력 하고 해당 하 는 지령 은 지 정 된 등급 을 대표 하 는 자 모 를 제시한다.유형 은 2 로 특정한 시험장 의 수험생 수 와 총 점 을 통계 수출 하 라 고 요구 하고 해당 하 는 지 시 는 지 정 된 시험장 의 번 호 를 제시한다.유형 은 3 으로 특정한 날 짜 를 지정 한 수험생 수 를 시험장 으로 나 누 어 통계 수출 하도록 요구 하고 해당 하 는 지 시 는 지 정 된 날 짜 를 제시 하 며 형식 은 수험표 의 날짜 와 같다.
출력 형식: 모든 통계 에 대한 요 구 는 먼저 한 줄 에 Case \ #: 요구, 그 중 \ # 이 요구 하 는 번호 입 니 다. 1 부터 시작 합 니 다.요구 사항 은 입력 을 복사 하 는 것 입 니 다.그 다음 에 해당 하 는 통계 결 과 를 출력 한다. · 유형 이 1 인 명령, 출력 형식 은 입력 한 수험생 정보 형식 과 같 고 즉 수험표 성적 이다.점수 가 병렬 된 수험생 에 대해 수험표 번호 의 사전 순서에 따라 수출 을 점차 늘린다 (문 제 는 중복 수험표 번호 가 없 음 을 보증한다).형식 이 2 인 명령 은 인원수 총 분 의 형식 으로 출력 합 니 다.유형 은 3 의 명령 이 고 출력 은 인원수 에 따라 증가 하지 않 는 순서 이 며 형식 은 시험장 번호 의 총 인원수 이다.인원 이 병렬 되면 시험장 번호 가 증가 하 는 순서에 따라 출력 한다.검색 결과 가 비어 있 으 면 NA 를 출력 합 니 다.
입력 예시:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999

출력 예시:
Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA

이 문 제 는 나 에 게 '갑' 을 만 났 고 제시 한 조건 이 매우 많다 는 느낌 을 주 었 다.저 는 각 정 보 를 포함 하 는 구조 체 로 모든 수험생 의 정 보 를 저장 한 다음 에 데 이 터 를 3 으로 나 누 어 각각 세 가지 케이스 에 대해 순 서 를 매 긴 다음 에 필요 에 따라 찾 습 니 다.이렇게 하면 매번 찾 을 때마다 정렬 해 야 하 는 비용 을 최대한 낮 출 수 있다.케이스 3 은 앞의 두 개 보다 좀 번 거 로 우 며, 매번 검색 조건 을 제시 한 후, 각 시험장 의 인원 을 통계 해 야 한다.나 는 처음에 논리 적 통일 을 위해 시험장 번 호 를 1 부터 시 작 했 지만 빠 른 줄 을 사용 할 때 0 부터 시 작 했 기 때문에 비극 적 이 었 다. 그리고 이 bug 는 여러 개의 테스트 데 이 터 를 사용 해서 야 문제점 을 측정 했다.이 문 제 를 다 쓴 후에 저 는 방법 을 보 러 갔 습 니 다. 류 신 이 쓴 cmp 는 정말 저 를 놀 라 게 했 습 니 다. 빨리 작은 공책 을 가지 고 공 부 를 했 습 니 다.비록 코드 가 만점 을 받 았 고 시간 도 괜 찮 았 지만 아직도 많은 개선 점 이 있다 는 것 을 발견 했다. 케이스 2 와 케이스 3 는 정렬 할 필요 가 없다. 케이스 1 에 의 해 관성 적 인 사 고 를 받 았 다. 정렬 한 후에 찾 는 것 이 얼마 빠 르 지 않 지만 정렬 하 는 시간 은 확실히 소모 되 었 다.다음은 출력 결 과 를 읽 기 쉬 운 파일 로 출력 코드 를 입력 하 는 것 입 니 다. 파일 형식 으로 보지 않 으 면 읽 기 가 쉽 지 않 습 니 다.사용 할 때 같은 디 렉 터 리 아래 에 '1095. in' 을 입력 으로 만 들 면 '1095. out' 을 출력 파일 로 하고 텍스트 문서 형식 으로 열 면 됩 니 다.다음은 코드:
#include
#include

typedef struct Stu
{
    char level;
    int exam_number;
    long date;
    int id_number;
    int grade;
}Stu;

typedef struct Room
{
    int Room_no;
    int count;
}Room;

int cmp1(const void *a,const void *b);
int cmp2(const void *a,const void *b);
int cmp3(const void *a,const void *b);
int cmp4(const void *a,const void *b);
void case_1(char c,struct Stu student[4][10000],int n,FILE *q);
void case_2(struct Stu student[4][10000],int n,int exam,FILE *q);
void case_3(struct Stu student[4][10000],int n,long date,FILE *q);

int main(void)
{
    FILE *p = fopen("./1095.in", "r");
    FILE *q = fopen("./1095.out", "w");
    Stu student[4][10000];
    int n,m;
    int i,j;
    long temp,temp1,temp2;
    char c;
    fscanf(p,"%d %d%c",&n,&m,&c);
    for(i = 0;i < n;i++)
    {
        fscanf(p,"%c",&c);                     //level
        for(j = 1;j <= 3;j++)
        {
            student[j][i].level = c;
            student[j][i].date = 0;
            student[j][i].exam_number = 0;
            student[j][i].grade = 0;
            student[j][i].id_number = 0;
        }
        temp = 0;
        for(j = 1;j <= 3;j++)           //exam_number
        {
            fscanf(p,"%c",&c);
            temp = temp * 10 + (c - '0');
        }
        temp1 = 0;
        for(j = 1;j <= 6;j++)               //date
        {
            fscanf(p,"%c",&c);
            temp1 = temp1 * 10 + (c - '0');
        }
        temp2 = 0;
        for(j = 1;j <= 3;j++)           //id_number
        {
            fscanf(p,"%c",&c);
            temp2 = temp2 * 10 + (c - '0');
            student[j][i].date = temp1;
            student[j][i].exam_number = temp;
        }
        fscanf(p,"%ld%c",&temp,&c);
        for(j = 1;j <= 3;j++)
        {
            student[j][i].grade = temp;
            student[j][i].id_number = temp2;
        }
    }
    qsort(&student[1][0],n,sizeof(Stu),cmp1);
    qsort(&student[2][0],n,sizeof(Stu),cmp2);
    qsort(&student[3][0],n,sizeof(Stu),cmp3);
    for(i = 1;i <= m;i++)
    {
        fprintf(q,"Case %d: ",i);
        fscanf(p,"%ld",&temp);
        if(temp == 1)
        {
            fscanf(p,"%c",&c);
            fscanf(p,"%c",&c);
            fprintf(q,"1 %c
"
,c); case_1(c,student,n,q); } else { if(temp == 2) { fscanf(p,"%ld",&temp); fprintf(q,"2 %ld
"
,temp); case_2(student,n,temp,q); } else { fscanf(p,"%ld",&temp); fprintf(q,"3 %06ld
"
,temp); case_3(student,n,temp,q); } } if(i < m) fprintf(q,"
"
); } fclose(p); fclose(q); return 0; } int cmp1(const void *a,const void *b) { struct Stu *aa=(Stu *)a; struct Stu *bb=(Stu *)b; int f = 1; if(aa->level > bb->level) { f = 1; } else { if (aa->level < bb->level) { f = -1; } else // { if(aa -> grade < bb -> grade) { f = 1; } else { if(aa -> grade > bb -> grade) { f = -1; } else // { if(aa -> exam_number > bb ->exam_number) { f = 1; } else { if(aa -> exam_number < bb ->exam_number) { f = -1; } else // { if(aa -> date > bb ->date) { f = 1; } else { if(aa -> date < bb ->date) { f = -1; } else // { if(aa -> id_number > bb ->id_number) { f = 1; } else f = -1; } } } } } } } } return f; } int cmp2(const void *a,const void *b) { struct Stu *aa=(Stu *)a; struct Stu *bb=(Stu *)b; int f = 0; if(aa -> exam_number > bb -> exam_number) f = 1; else f = -1; return f; } int cmp3(const void *a,const void *b) { struct Stu *aa=(Stu *)a; struct Stu *bb=(Stu *)b; int f = 0; if(aa -> date > bb ->date) { f = 1; } else { if(aa -> date < bb ->date) { f = -1; } else { if(aa -> exam_number > bb -> exam_number) f = 1; else f = -1; } } return f; } void case_1(char c,struct Stu student[4][10000],int n,FILE *q) { int i = 0; int f = 1; while(student[1][i].level != c && i < n) { i++; } while(student[1][i].level == c && i < n) { fprintf(q,"%c%03d%06ld%03d %d",student[1][i].level,student[1][i].exam_number,student[1][i].date,student[1][i].id_number,student[1][i].grade); i++; f = 0; if(student[1][i].level == c && i < n) fprintf(q,"
"
); } if (f) fprintf(q,"NA"); } void case_2(struct Stu student[4][10000],int n,int exam,FILE *q) { int s = 0,i = 0; int sum = 0; while(student[2][i].exam_number != exam && i < n) { i++; } while(student[2][i].exam_number == exam && i < n) { s++; sum += student[2][i].grade; i++; } if(s != 0) fprintf(q,"%d %ld",s,sum); else fprintf(q,"NA"); } void case_3(struct Stu student[4][10000],int n,long date,FILE *q) { Room a[1000]; int i; int f = 1; for(i = 0;i < 1000;i++) { a[i].Room_no = i; a[i].count = 0; } for(i = 0;i < n;i++) { if(student[3][i].date == date) { a[student[3][i].exam_number].count++; } } qsort(a,1000,sizeof(Room),cmp4); i = 0; while(a[i].count != 0) { fprintf(q,"%d %d",a[i].Room_no,a[i].count); i++; if(a[i].count != 0)fprintf(q,"
"
); f = 0; } if (f) fprintf(q,"NA"); } int cmp4(const void *a,const void *b) { struct Room *aa=(Room *)a; struct Room *bb=(Room *)b; int f = 0; if(aa -> count < bb -> count) { f = 1; } else { if(aa -> count > bb -> count) { f = -1; } else { if(aa -> Room_no > bb -> Room_no) f = 1; else f = -1; } } return f; }

좋은 웹페이지 즐겨찾기