PAT B 1080 MOOC 기 말 성적 (C 언어)

20818 단어 PATBPAT B 급
1080 MOOC 기 말 성적 사고 분석
제목
중국 대학 MOOC 에서 '데이터 구조' 과정 을 공부 하 는 학생 에 게 합격 증 을 받 으 려 면 먼저 200 점 이하 의 온라인 프로 그래 밍 숙제 점 수 를 받 은 뒤 총평 에서 60 점 (100 점 만점) 이상 을 받 아야 한다.총평 성적 의 계산 공식 은 G = (G. mid - term) 이다.×40%+G.​final​​ × 60%), 만약 G. mid - term > G. final;그렇지 않 으 면 총평 G 가 G. final 이다.여기 서 G. mid - term 과 G. final 은 각각 학생 들 의 기와 기 말 성적 이다.
문 제 는 시험 때마다 독립 적 인 성적표 가 나 오 는 것 이다.이 문 제 는 프로그램 을 짜 서 다른 성적 표를 한 장 으로 합 쳐 주세요.
입력 형식: 첫 줄 에 입력 하면 P (온라인 프로 그래 밍 숙제 를 한 학생 수), M (중간고사 에 참가 한 학생 수), N (기말고사 에 참가 한 학생 수) 등 3 개의 정 수 를 줍 니 다.매 수 는 10000 을 넘 지 않 는 다.
다음은 세 개의 입력 이 있 습 니 다.첫 번 째 블록 은 P 개의 온라인 프로 그래 밍 성적 G p 를 포함 합 니 다.두 번 째 는 M 개 중간고사 성적 G mid - term 를 포함한다.세 번 째 는 N 개의 기말고사 성적 G final 을 포함한다.
각 성적 은 한 줄 을 차지 하 는데, 형식 은 학생 번호 점수 이다.그 중에서 학생 학 번 은 20 자 를 초과 하지 않 는 영문 자모 와 숫자 이다.점 수 는 비 마이너스 정수 (프로 그래 밍 총 점 최고 900 점, 기 중 · 기 말 최고 100 점) 다.
출력 형식: 합격 증 을 받 은 학생 명단 을 출력 합 니 다.각 학생 이 한 줄 을 차지 합 니 다. 형식 은 다음 과 같 습 니 다.
학생 학 번 G p G. mid - term G. final G
만약 어떤 성적 이 존재 하지 않 는 다 면 (예 를 들 어 누군가가 중간고사 에 참가 하지 않 았 다) 해당 위치 에서 '- 1' 을 출력 한다.수출 순 서 는 총평 점수 (반올림 정확 에서 정수) 에 따라 점차 줄어든다.병렬 되 어 있 으 면, 학 번 에 따라 점차 증가한다.문 제 는 학 번 이 중복 되 지 않 고 적어도 1 명의 합격 학생 이 존재 한 다 는 것 을 보증한다.
입력 샘플: 6, 6, 7 01234 880 a1903 199 ydjh 2 200 wehu 8 300 dx86w 220 missing 400 ydhfu 77 99 wehu 8 55 ydjh 2 98 dx86w 88 a1903 86 01234 39 ydhfu 77 88 a1903 66 01234 58 wehu 8 84 ydjh 2 82 missing 99 dx86w 81
출력 사례: missing 400 - 199 99 ydjh 2 200 98 82 88 dx86w 220 88 84 wehu 8 300 55 84
저자: CHEN, Yue 단위: 절강대학 교 시간 제한: 200 ms 메모리 제한: 64 MB 코드 길이 제한: 16 KB
분석
2 분 검색 솔 루 션 학습 자 패왕 토끼 난점 1: 실행 시간 초과 1 차 는 기계 시험 합격 자의 정보 만 읽 은 다음 에 이런 정 보 를 학 번 사전 순서에 따라 신속하게 정렬 하고 후속 정 보 를 입력 할 때 bsearch () [2 분 검색] 함수 로 학 번 위치 에 따라 정 보 를 입력 합 니 다.
bsearch( const void * key,const void * base,size_t n,size_t size,int (* cmp)(const void *,const void *) );

bsearch (): 의 2 분 검색 라 이브 러 리 함수 입 니 다. base 에서 base + n 까지 * key 와 일치 하 는 크기 가 size 인 항목 을 찾 고 이 주 소 를 되 돌려 줍 니 다. 찾 지 못 하면 NULL 로 돌아 갑 니 다.이 함수 에 사용 되 는 cmp () 함 수 는 qsort () 용법 과 비슷 합 니 다. base [] 에서 요소 의 오름차 순 으로 배열 하면 cmp () 에서 첫 번 째 요소 인 코 인 두 번 째 요소 가 크 고 플러스 로 돌아 가 며 반대로 마이너스 로 돌아 갑 니 다.즉, qsort () 를 사용 하여 base [] 를 정렬 하면 간단 한 상황 에서 bsearch 는 qsort () 와 같은 cmp () 함 수 를 사용 할 수 있 습 니 다.
STEP 1: 합 법 적 이 고 합 격 된 프로 그래 밍 시험 성적 만 입력 하고 학 번 사전 순서에 따라 빠르게 정렬 합 니 다.STEP 2: 학 번 2 점 에 따라 학 번 에 맞 는 성적 을 찾 아 중간고사 성적 을 입력 합 니 다.STEP 3: 학 번 2 점 에 따라 학 번 에 맞 는 성적 을 찾 아 기 말 시험 성적 을 입력 하고 해당 수험생 이 총 평 가 를 통과 하면 Pass [] 배열 에 저장 합 니 다.STEP 4: Pass [] 배열 에 대해 1 급 총 점 내림차 순, 2 급 학 번 사전 순 으로 빠르게 정렬 합 니 다.STEP 5: Pass [] 의 학생 정 보 를 출력 합 니 다.
3. 실수 하기 쉬 운 점 & 팁:
반올림
1. double 로 데 이 터 를 저장 하고 A * 0.4 + B * 0.6, 출력 할 때%. 0lf 는 0 비트 의 소 수 를 유지 하 며 자동 반올림 하 는 2, 성형 (int 등) 으로 데 이 터 를 저장 하고 A * 0.4 + B * 0.6 + 0.5 로 반올림 을 실현 할 수 있 습 니 다.
4. 코드 구현
#include 
#include 
#include 
typedef struct
{
    char ID[21];
    int Gp,Gm,Gf,G;
}Stu;
int cmpID(const void * a,const void * b)
{   return strcmp( (*(Stu *)a).ID , (*(Stu *)b).ID );   }
int cmpG(const void * a,const void * b)
{
    if( (*(Stu *)a).G != (*(Stu *)b).G )
        return (*(Stu *)b).G-(*(Stu *)a).G;
    else return strcmp( (*(Stu *)a).ID , (*(Stu *)b).ID );
}
int main()
{
    int P,M,N,cnt=0,score,G,nP=0;
    char ID[21];
    scanf("%d %d %d",&P,&M,&N);
    Stu A[P],Pass[P],*p;
    for(int i=0 ; i<P ; i++)
    {
        scanf("%s %d",A[cnt].ID,&A[cnt].Gp);
        if( A[cnt].Gp >= 200 )
        {
            A[cnt].Gm=A[cnt].Gf=A[cnt].G=-1;
            cnt++;
        }
    }
    qsort(A,cnt,sizeof(Stu),cmpID);
    for(int i=0 ; i<M ; i++)
    {
        scanf("%s %d",ID,&score);
        if( p = (Stu *)bsearch(ID,A,cnt,sizeof(Stu ),cmpID) )
            (*p).Gm=score;
    }
    for(int i=0 ; i<N ; i++)
    {
        scanf("%s %d",ID,&score);
        if( p = (Stu *)bsearch(ID,A,cnt,sizeof(Stu ),cmpID) )
        {
            (*p).G = ( score>=(*p).Gm ? score : ( score*0.6+(*p).Gm*0.4+0.5 ) );
            (*p).Gf = score;
            if( (*p).G>=60 )
                Pass[nP++]=*p;
        }
    }
    qsort(Pass,nP,sizeof(Stu ),cmpG);
    for(int i=0 ; i<nP ; i++)
        printf("%s %d %d %d %d
"
,Pass[i].ID,Pass[i].Gp,Pass[i].Gm,Pass[i].Gf,Pass[i].G); }

좋은 웹페이지 즐겨찾기