p1444.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 80 行

CPP
80
字号
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <algorithm>
#define MAXS    10000
#define MAXP    101

using namespace std;

struct  TNode {
        int     Word;
        TNode   *Next [52];
        TNode ();
}       Root;

TNode :: TNode ()
{
        Word = -1;
        memset ( Next , 0, sizeof ( Next ));
}

int     ProbNum , StudNum;
struct  TStudent {
        int     ProbAC , TotalTime , TimeCost [MAXP];
        char    Name [40] , Name2 [40];
}       Student [MAXS];

int     Order [MAXS];

bool    cmp ( const int &a , const int &b )
{
        return  Student [a].ProbAC == Student [b].ProbAC ?
                Student [a].TotalTime == Student [b].TotalTime ?
                        strcmp ( Student [a].Name2 , Student [b].Name2 ) < 0 : Student [a].TotalTime < Student [b].TotalTime
                : Student [a].ProbAC > Student [b].ProbAC;
}

main ()
{
        freopen ( "p.in" , "r" , stdin );
        freopen ( "p.out" , "w" , stdout );

        int     i , len , next;
        int     Time , Prob;
        char    Str [40] , State [10];
        TNode   *P;
        TStudent *S;

        memset ( Student , 0 , sizeof ( Student ));
        scanf ( "%d" , &ProbNum ); StudNum = 0;

        while ( scanf ( "%d%s%d%s" , &Time , Str , &Prob , State ) != EOF ) {
                for ( P = &Root , i = 0 , len = strlen ( Str ); i < len; i ++ , P = P->Next [next] ) {
                        next = Str [i] > 'Z' ? Str [i] - 'a' + 26 : Str [i] - 'A';
                        if ( P->Next [next] == NULL ) P->Next [next] = new TNode; 
                }
                if ( P->Word == -1 ) {
                        P->Word = StudNum ++;
                        strcpy ( Student [P->Word].Name , Str );
                        strcpy ( Student [P->Word].Name2 , Str );
                        for ( i = 0; i < len; i ++ ) Student [P->Word].Name2 [i] = tolower ( Str [i] );
                }
                S = &Student [P->Word];
                if ( State [0] == 'A' && S->TimeCost [Prob] >= 0 )
                        S->ProbAC ++ , S->TotalTime += Time + S->TimeCost [Prob] , S->TimeCost [Prob] = -9999999;
                        else S->TimeCost [Prob] += 20;
        }

        for ( i = 0; i < StudNum; i ++ ) Order [i] = i;
        sort ( Order , Order + StudNum , cmp );

        for ( i = 0; i < StudNum; i ++ ) {
                if ( Student [Order [i]].ProbAC == 0 ) break;
                if ( i && Student [Order [i]].ProbAC == Student [Order [i - 1]].ProbAC && Student [Order [i]].TotalTime == Student [Order [i - 1]].TotalTime )
                        printf ( "%10c" , ' ' );
                else printf ( "%-10d" , i + 1 );
                printf ( "%-30s%-10d%d\n" , Student [Order [i]].Name , Student [Order [i]].ProbAC , Student [Order [i]].TotalTime );                
        }
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?