#include<iostream>
#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <sstream>
#define M 500
using namespace std;
char s[M];struct Node {
    //    int year, month, date;
    int hour, minutes, seconds;    Node() {
        hour = minutes = seconds = 0;
    }    bool operator<(Node a) {
        return hour * 60 * 60 + minutes * 60 + seconds < a.hour * 60 * 60 + a.minutes * 60 + a.seconds;
    }    Node turn(Node a) {
        Node t;
        t.minutes = minutes - a.minutes;
        t.seconds = seconds - a.seconds;
        //        t.date = date - a.date;
        //        t.month = date - a.date;
        //        t.year = year - a.year;
        t.hour = hour - a.hour;
        if (t.seconds < 0)t.seconds += 60, t.minutes--;
        if (t.minutes < 0)t.minutes += 60, t.hour--;
        t.minutes += t.seconds / 60;
        t.seconds %= 60;
        t.hour += t.minutes / 60;
        t.minutes %= 60;
        return t;
        //        t.hour += t.date * 24 + t.month * 30 + t.year * 365;
    }    void add(Node a) {
        minutes = minutes + a.minutes;
        seconds = seconds + a.seconds;
        hour = hour + a.hour;
        if (seconds < 0)seconds += 60, minutes--;
        if (minutes < 0)minutes += 60, hour--;
        minutes += seconds / 60;
        seconds %= 60;
        hour += minutes / 60;
        minutes %= 60;
    }
} f, t, z, now;struct Team {
    char name[M];
    Node time[M];
    int num;
    Node ttime;
    int solve[M];    Team() {
        memset(solve, 0, sizeof (solve));
        num = 0;
    }
} team[M];int cmp(Team a, Team b) {
    if (a.num != b.num)
        return a.num > b.num;
    return a.ttime < b.ttime;
}
int pro[M];int main(int argc, char** argv) {
    ifstream out;
    int id;
    char name[25];
    int problem;
    char state[25];
    char L[3][25];
    char tmp[50];
    int y, mon, d;
    int h, min, se;
    cin >> s;
    out.open(s);
    int num;
    bool ok = false;
    int n = 0;
    out >> tmp >> s;
    sscanf(s, "%d:%d:%d", &f.hour, &f.minutes, &f.seconds);
    out >> tmp >> s;
    sscanf(s, "%d:%d:%d", &t.hour, &t.minutes, &t.seconds);
    out.get();
    out.getline(s, 1000, '\n');
    stringstream sin(s);
    while (sin >> num) {
        pro[n] = num;
        n++;
    }
    int nn = 0;
    int pid;
    while (!out.eof()) {
        out.getline(s, 1000, '\n');
        sscanf(s, "%d %s %d %s %s %s %s %s %d:%d:%d", &id, &name, &problem, &state, &L[0], &L[1], &L[2], &tmp, &now.hour, &now.minutes, &now.seconds);
        for (int i = 0; i < n; i++) {
            if (pro[i] == problem) {
                num = i;
                break;
            }
        }
        pid = -1;
        for (int i = 0; i < nn; i++) {
            if (strcmp(team[i].name, name) == 0) {
                pid = i;
            }
        }
        if (pid == -1) {
            strcpy(team[nn].name, name);
            pid = nn;
            nn++;
        }
        if (team[pid].solve[num] != -1) {
            if (strcmp(state, "Accepted") == 0) {
                team[pid].solve[num] = -1;
                team[pid].time[num].add(now.turn(f));
                team[pid].num++;
            } else {
                team[pid].solve[num]++;
                team[pid].time[num].seconds += 20;
            }
        }
    }
    for (int i = 0; i < nn; i++) {
        for (int j = 0; j < n; j++) {
            team[i].time[j].add(z);
            if (team[i].solve[j] == -1) {
                team[i].ttime.add(team[i].time[j]);
            }
        }
    }
    sort(team, team + nn, cmp);
    cout << "Rank Name Solved";
    for (int i = 0; i < n; i++)
        cout << " " << pro[i];
    cout << " Penalty" << endl;
    for (int i = 0; i < nn; i++) {
        cout << i + 1 << " " << team[i].name << " " << team[i].num;
        for (int j = 0; j < nn; j++) {
            cout << " ";
            if (team[i].solve[j] == -1) {
                cout << team[i].time[j].hour << ":" << team[i].time[j].minutes << ":" << team[i].time[j].seconds;
            } else {
                cout << -team[i].solve[j];
            }
        }
        cout << " " << team[i].ttime.hour << ":" << team[i].ttime.minutes << ":" << team[i].ttime.seconds << endl;
    }
    out.close();    return 0;
}

解决方案 »

  1.   

    题面描述:
    ACM/ICPC 比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则
    主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。
    解题数量很容易计算,只需考察比赛中标记为“Accepted”的题数即可。罚时计算则相对复
    杂,对于提交到竞赛系统中的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的
    代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之
    前的每次提交,都有20 分钟的罚时,但如果该题目最终未解出,则不计罚时。
    先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。
    输入:
    过题信息记录在文件为input.in中。其格式为:
    第一行为比赛的开始时间和结束时间,第二行为对应的题目ID 列表,紧随其后的是一系列
    题目通过情况记录,其格式为:
    12129 lzz 1000 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27
    从左到右依次为:提交ID、用户名、题目ID、判题结果、占用内存、耗时、编程语言、代
    码长度和提交时间。
    其中提交时间的格式为:XXXX-XX-XX XX:XX:XX。
    判题结果可能为以下项目之一:Accepted、Wrong_Answer、Time_Limit_Exceed、
    Memory_Limit_Exceed、Presentation_Error 和Runtime_Error。
    输出:
    比赛的排行榜,输出到当前目录下的output.out文件中。排行榜的第一行需包含如下信息:
    Rank Name Solved 1000 1001 1002 1003 1004 Penalty
    其中Solved 和Penalty之间的列为比赛题目列表。以下为一场比赛某个时间的排行榜,其中
    每行都和第一行类似,即:
    比赛排名、用户ID、解题数、从比赛开始到该题被解出的时间(格式为XX:XX:XX,最后一列
    的总罚时也是这个格式)或失败的次数(格式为“-number”,如“-1”表示失败一次)。每
    列之间由一个空格分隔开。若两个参赛选手解题数和耗时均相同,则应按照其用户ID 的字
    母顺序排列。这个就是题了~各位大神帮帮忙哈
      

  2.   

    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class test {
    public static void main(String[] args) throws IOException, ParseException {
    Team[] team = new Team[500];
    for (int i = 0; i < 500; i++)
    team[i] = new Team(); Node f = new Node();
    Node t = new Node();
    Node z = new Node();
    Node now = new Node();// File file = new File("E://te.txt");
    RandomAccessFile in = new RandomAccessFile("E://input.in", "r");
    char s[] = new char[500];
    int pro[] = new int[500]; int id;
    String name = "";
    int problem;
    String state = "";
    String L[] = new String[3];
    String tmp = "";
    int y, mon, d;
    int h, min, se;
    // cin >> s;
    // out.open(s);
    int num = 0;
    boolean ok = false;
    int n = 0;
    String temp = in.readLine();
    SimpleDateFormat dateFormat = new SimpleDateFormat(
    "yyyy-MM-dd hh:mm:ss"); Date startDate = dateFormat.parse(temp.substring(0, temp.length() / 2));
    Date endDate = dateFormat.parse(temp.substring(temp.length() / 2));
    f.setHour(startDate.getHours());
    f.setMinutes(startDate.getMinutes());
    f.setSeconds(startDate.getSeconds());
    t.setHour(endDate.getHours());
    t.setMinutes(endDate.getMinutes());
    t.setSeconds(endDate.getSeconds());
    temp = in.readLine();
    String noList[] = temp.split(" ");
    for (int i = 0; i < noList.length; i++)
    pro[i] = Integer.parseInt(noList[i]);
    n = noList.length; int nn = 0;
    int pid;
    // in.close(); try {
    while (true) {
    temp = in.readLine();
    String infoList[] = temp.split(" ");
    id = Integer.parseInt(infoList[0]);
    name = infoList[1];
    problem = Integer.parseInt(infoList[2]);
    state = infoList[3];
    L[0] = infoList[4];
    L[1] = infoList[5];
    L[2] = infoList[6];
    tmp = infoList[7];
    Date subDate = dateFormat
    .parse(infoList[8] + " " + infoList[9]);
    now.setHour(subDate.getHours());
    now.setMinutes(subDate.getMinutes());
    now.setSeconds(subDate.getSeconds());
    for (int i = 0; i < n; i++) {
    if (pro[i] == problem) {
    num = i;
    break;
    }
    }
    pid = -1;
    for (int i = 0; i < nn; i++) {
    if (team[i].getName().equals(name)) {
    pid = i;
    }
    } if (pid == -1) {
    team[nn].name = name;
    pid = nn;
    nn++;
    }
    if (team[pid].solve[num] != -1) {
    if (state.equals("Accepted")) {
    team[pid].solve[num] = -1;
    team[pid].time[num].add(now.turn(f));
    team[pid].num++;
    } else {
    team[pid].solve[num]++;
    team[pid].time[num].seconds += 20;
    }
    }
    }
    } catch (Exception e) { System.out.println("读取结束!");
    in.close();
    }
    for (int i = 0; i < nn; i++) {
    for (int j = 0; j < n; j++) {
    team[i].time[j].add(z);
    if (team[i].solve[j] == -1) {
    team[i].ttime.add(team[i].time[j]);
    }
    }
    }
    for (int x = 0; x < nn; x++)
    for (int q = x; q < nn; q++) {
    if (!Team.cmp(team[x], team[q])) {
    Team te = team[x];
    team[x] = team[q];
    team[q] = te; } }
    System.out.print("Rank Name Solved");
    for (int i = 0; i < n; i++)
    System.out.print(" " + pro[i]);
    System.out.println(" Penalty");
    for (int i = 0; i < nn; i++) {
    System.out.print((i + 1) + " " + team[i].name + " " + team[i].num);
    for (int j = 0; j < n; j++) {
    System.out.print(" ");
    if (team[i].solve[j] == -1) {
    System.out.print(team[i].time[j].hour + ":"
    + team[i].time[j].minutes + ":"
    + team[i].time[j].seconds);
    } else {
    System.out.print(-team[i].solve[j]);
    }
    }
    System.out.println(" " + team[i].ttime.hour + ":"
    + team[i].ttime.minutes + ":" + team[i].ttime.seconds);
    }
    // out.close(); return;
    }}class Node {
    public int hour, minutes, seconds; Node() {
    hour = minutes = seconds = 0;
    } public int getHour() {
    return hour;
    } public void setHour(int hour) {
    this.hour = hour;
    } public int getMinutes() {
    return minutes;
    } public void setMinutes(int minutes) {
    this.minutes = minutes;
    } public int getSeconds() {
    return seconds;
    } public void setSeconds(int seconds) {
    this.seconds = seconds;
    } public boolean operator(Node a) {
    return hour * 60 * 60 + minutes * 60 + seconds < a.hour * 60 * 60
    + a.minutes * 60 + a.seconds;
    } public Node turn(Node a) {
    // return a; Node t = new Node();
    t.minutes = minutes - a.minutes;
    t.seconds = seconds - a.seconds;
    // t.date = date - a.date;
    // t.month = date - a.date;
    // t.year = year - a.year;
    t.hour = hour - a.hour;
    if (t.seconds < 0) {
    t.seconds += 60;
    t.minutes--;
    } if (t.minutes < 0) {
    t.minutes += 60;
    t.hour--; }
    t.minutes += t.seconds / 60;
    t.seconds %= 60;
    t.hour += t.minutes / 60;
    t.minutes %= 60;
    return t;
    // t.hour += t.date * 24 + t.month * 30 + t.year * 365; } public void add(Node a) {
    minutes = minutes + a.minutes;
    seconds = seconds + a.seconds;
    hour = hour + a.hour;
    if (seconds < 0) {
    seconds += 60;
    minutes--;
    } if (minutes < 0) {
    minutes += 60;
    hour--; }
    minutes += seconds / 60;
    seconds %= 60;
    hour += minutes / 60;
    minutes %= 60;
    }
    }class Team {
    public String name = "";
    public Node time[] = new Node[500];
    public int num;
    public Node ttime;
    public int solve[] = new int[500]; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Node[] getTime() {
    return time;
    } public void setTime(Node[] time) {
    this.time = time;
    } public int getNum() {
    return num;
    } public void setNum(int num) {
    this.num = num;
    } public Node getTtime() {
    return ttime;
    } public void setTtime(Node ttime) {
    this.ttime = ttime;
    } public int[] getSolve() {
    return solve;
    } public void setSolve(int[] solve) {
    this.solve = solve;
    } Team() {
    for (int j = 0; j < 500; j++) {
    time[j] = new Node();
    }
    ttime = new Node();
    for (int i = 0; i < solve.length; i++) {
    solve[i] = 0;
    }
    num = 0;
    } public static boolean cmp(Team a, Team b) {
    if (a.num != b.num)
    return a.num > b.num;
    return a.ttime.operator(b.ttime);
    }
    }
    //input.in放在E盘,测试内容为
    2008-04-25 10:05:00 2008-04-25 20:00:00
    1000 1001 1002 1003 1004 1005
    12129 lzz 1000 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27
    12130 lza 1001 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27
    12131 lzb 1001 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:26
    12132 lzc 1000 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27
    12133 lzc 1004 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27
    12134 lzc 1005 Accepted 904K 10MS C++ 134B 2008-04-25 23:29:27//输出结果为
    读取结束!
    Rank Name Solved 1000 1001 1002 1003 1004 1005 Penalty
    1 lzc 3 13:24:27 0 0 0 13:24:27 13:24:27 40:13:21
    2 lzb 1 0 13:24:26 0 0 0 0 13:24:26
    3 lza 1 0 13:24:27 0 0 0 0 13:24:27
    4 lzz 1 13:24:27 0 0 0 0 0 13:24:27