ZOJ - 3705 Applications 【模拟】

题目链接

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3705

题意

给出N个队员 然后一个教练要从中选择 M名队员 要选最优的M名

然后根据这么来判断

IF做过的题目是属于 MaoMao Selection 那么 pts + 2.5
else IF属于 Old Surgeon Contest pts + 1.5
else IF 题目序号是素数 pts + 1
else pts + 0.3

IF 参赛的队伍获得一等奖 pts + 36
else IF 获得二等奖 pts + 27
else IF 获得三等奖 pts + 18
else pts + 0

参加 JapanJam 类的比赛 (计算rating)

用第三高的 rating 作为 r

Pts = max(0, (r - 1200) / 100) * 1.5

计算这个式子 算得 要加的 pts

最后 如果这名队员是女生 pts + 33

输入:
先输入T 表示 T组数据
输入 N M 表示 N名队员 选 M个
输入 R 再有R个题目 序号 表示 这R个题目是 MaoMao Selection
输入 S 再有S个题目序号 表示 这 S个题目是 Old Surgeon Contest
输入 Q
接下来 Q 行
每行三个参数 string int
分别代表 队伍名称 获得的奖项序号

接下来 N 行
参数 string string char int int
表示 队员名称 所属的队伍名称 性别 所做的题目数量 和 参加的 japan 比赛次数
然后会列出 题目序号 以及 每次参加 japan 所获得的 rating

思路

大概 题意讲清,,就能 A了吧

对了 如果 rating 个数 不足三个 那么 pts + 0

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<list>
#include<stack>
#include <queue>

#define CLR(a, b) memset(a, (b), sizeof(a))

using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 1e2 + 5;
const int MOD = 1e9;

bool isprime(int x)
{
    int m = sqrt(x) + 1;
    for (int i = 2; i <= m; i++)
        if (x % i == 0)
            return false;
    return true;
}
struct node
{
    string name;
    double score;
};

bool comp(int x, int y)
{
    return x > y;
}

bool cmp(node x, node y)
{
    if (x.name == y.name)
        return x.name < y.name;
    return x.score > y.score;
}

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        map <int, int> mao, old;
        int n, m;
        scanf("%d%d", &n, &m);
        int k;
        scanf("%d", &k);
        int num;
        for (int i = 0; i < k; i++)
        {
            scanf("%d", &num);
            mao[num] = 1;
        }
        scanf("%d", &k);
        for (int i = 0; i < k; i++)
        {
            scanf("%d", &num);
            old[num] = 1;
        }
        map <string, int> prize;
        scanf("%d", &k);
        string s;
        for (int i = 0; i < k; i++)
        {
            cin >> s;
            scanf("%d", &num);
            if (num == 1)
                prize[s] = 36;
            else if (num == 2)
                prize[s] = 27;
            else if (num == 3)
                prize[s] = 18;
            else if (num == 0)
                prize[s] = 0;
        }
        vector <node> ans;
        char c;
        for (int i = 0; i < n; i++)
        {
            node u;
            u.score = 0.0;
            cin >> u.name;
            cin >> s;
            u.score += prize[s];
            scanf(" %c", &c);
            if (c == 'F')
                u.score += 33;
            int v, w;
            scanf("%d%d", &v, &w);
            for (int i = 0; i < v; i++)
            {
                scanf("%d", &num);
                if (mao[num])
                    u.score += 2.5;
                else if (old[num])
                    u.score += 1.5;
                else if (isprime(num))
                    u.score += 1;
                else
                    u.score += 0.3;
            }
            vector <int> rat;
            for (int i = 0; i < w; i++)
            {
                scanf("%d", &num);
                rat.push_back(num);
            }
            if (rat.size() >= 3 )
            {
                sort(rat.begin(), rat.end(), comp);
                u.score += (0, (rat[2] - 1200) * 1.0 / 100) * 1.5;
            }
            ans.push_back(u);
        }
        sort(ans.begin(), ans.end(), cmp);
        for (int i = 0; i < m; i++)
        {
            cout << ans[i].name;
            printf(" %.3lf\n", ans[i].score);
        }
    }
}
posted @ 2018-04-13 23:00  Dup4  阅读(127)  评论(0编辑  收藏  举报