20120112

ACM 10258 Contest Scoreboard

又一題腦殘題……
每次寫到腦殘題頭都痛死惹……
首先problem數最多是13,不是什麼9……-.-。

另外只要得到correct之後,
不管之後又得到correct或是incorrect,
通通不用管它……

問題是題目有寫嗎?有嗎?沒吧!
那誰知道這種機車狀況要怎麼處理?
定義一下會死嗎?
無聊!

/* ACM 10258 Contest Scoreboard
 * mythnc
 * 2012/01/11 23:07:41   
 * run time: 0.004
 */
#include <stdio.h>
#include <string.h>

#define LINEMAX 25
#define MAXP 13
#define MAXC 100

typedef struct contestant {
    int num, solved, penalty;
    int tried[MAXP], ac[MAXP];
} Contestant;

typedef enum {FALSE = 0, TRUE} bool;

int input(Contestant *);
int find(Contestant *, int, int);
int cmp(const void *, const void *);
void output(Contestant *, int);

int main(void)
{
    Contestant con[MAXC];
    int set, i, n;

    scanf("%d", &set);
    getchar();
    getchar();
    for (i = 0; i < set; i++) {
        if (i > 0)
            putchar('\n');
        n = input(con);
        qsort(con, n, sizeof(Contestant), cmp);
        output(con, n);
    }

    return 0;
}

/* input: receive input datas */
int input(Contestant *con)
{
    int num, prob, time, n, pos;
    char sub;
    char line[LINEMAX];

    n = 0;
    while (fgets(line, LINEMAX, stdin)) {
        if (strlen(line) <= 1) /* blank line */
            break;
        sscanf(line, "%d %d %d %c", &num, &prob, &time, &sub);
        pos = find(con, num, n);
        if (pos == -1) {
            /* add and init */
            con[n].num = num;
            con[n].solved = con[n].penalty = 0;
            memset(con[n].tried, 0, MAXP);
            memset(con[n].ac, FALSE, MAXP);
            pos = n++;
        }
        if (sub == 'C' && !con[pos].ac[prob - 1]) {
            con[pos].solved++;
            con[pos].penalty += time + con[pos].tried[prob - 1];
            con[pos].ac[prob - 1] = TRUE;
        }
        else if (sub == 'I' && !con[pos].ac[prob - 1])
            con[pos].tried[prob - 1] += 20;
    }

    return n;
}

/* find: if num in con return it's position
 * else retrn -1 */
int find(Contestant *con, int num, int n)
{
    int i;

    for (i = 0; i < n; i++)
        if (con[i].num == num)
            return i;

    return -1;
}

/* cmp: for qsort() */
int cmp(const void *a, const void *b)
{
    if (((Contestant *)a)->solved != ((Contestant *)b)->solved)
        return ((Contestant *)b)->solved - ((Contestant *)a)->solved;
    else if (((Contestant *)a)->penalty != ((Contestant *)b)->penalty)
        return ((Contestant *)a)->penalty - ((Contestant *)b)->penalty;
    else
        return ((Contestant *)a)->num - ((Contestant *)b)->num;
}

/* output: output results */
void output(Contestant *con, int n)
{
    int i;

    for (i = 0; i < n; i++)
        printf("%d %d %d\n", con[i].num, con[i].solved, con[i].penalty);
}

沒有留言: