1075. PAT Judge (25)

题目地址:http://www.patest.cn/contests/pat-a-practise/1075

这种题目PAT常考, 就是构造结构体,写比较方法,还有输出的时候要注意题目的要求,把vector<>用会。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <string>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <sstream>

using namespace std;

#define N 10001

int n,kk,m;

int score[6];

struct mydata{
    int no;
    int scores[6];
    int totalscore;
    int rank;
    mydata()
    {
        int i;
        for (i = 0; i < 6; i++)
        {
            scores[i] = -2;
        }
        totalscore = 0;
        rank = 1;
    }
};

mydata v[N];

bool cmp(mydata d1, mydata d2)
{
    if (d1.totalscore > d2.totalscore)
        return true;
    if (d1.totalscore == d2.totalscore){
        int i, p1 = 0, p2 = 0;
        for (i = 1; i <= kk; i++)
        {
            if (d1.scores[i] == score[i])
                p1++;
            if (d2.scores[i] == score[i])
                p2++;
        }
        if (p1 > p2)
            return true;
        if (p1 == p2){
            return d1.no < d2.no;
        }
    }
    return false;
}

int main()
{
    //freopen("in", "r", stdin);
    int i, j;
    scanf("%d%d%d", &n, &kk, &m);
    for (i = 1; i <= kk; i++)
    {
        scanf("%d",&score[i]);
    }

    int id, pro, sco;
    for (i = 0; i < m; i++)
    {
        scanf("%d%d%d", &id, &pro, &sco);
        if (sco > v[id].scores[pro])
        {
            v[id].scores[pro] = sco;
        }
    }
    vector<mydata> v2;
    for (i = 1; i <= n; i++)
    {
        mydata dt = v[i];
        dt.no = i;
        int tsum = 0;
        bool flag = false;

        for (j = 1; j <= kk; j++)
        {
            if (dt.scores[j] >= 0)
            {
                flag = true;
                tsum += dt.scores[j];
            }
        }
        if (flag)
        {
            dt.totalscore = tsum;
            v2.push_back(dt);
        }
    }

    int len2 = v2.size();
    if (len2 > 1)
        sort(v2.begin(), v2.end(), cmp);

    v2[0].rank = 1;
    for (i = 1; i < len2; i++)
    {
        if (v2[i].totalscore == v2[i - 1].totalscore)
        {
            v2[i].rank = v2[i - 1].rank;
        }
        else{
            v2[i].rank = i + 1;
        }
    }
    for (i = 0; i < len2; i++)
    {
        printf("%d %05d %d", v2[i].rank, v2[i].no,v2[i].totalscore);
        for (j = 1; j <= kk; j++)
        {
            if (v2[i].scores[j] == -2)
            {
                printf(" -");
            }
            else if (v2[i].scores[j] == -1){
                printf(" 0");
            }
            else{
                printf(" %d", v2[i].scores[j]);
            }
        }
        printf("\n");
    }
    printf("");
    return 0;
}

你可能感兴趣的:(1075. PAT Judge (25))