PAT (Advanced Level) Practice——1011,1012

1011: 

链接:

1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn)

题意及解题思路:

简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。

同时还需要记录每一次选择的是W,T还是L,储存在字符串中即可,每一次后面加上一个空格,刚好结尾没有空格。

我刚开始理解成立奇数odd,但是odds表示赔率。

#include <bits/stdc++.h>

using namespace std;

typedef struct {
    double w, t, l;
} X;

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    vector<X> a;
    for (int i = 0; i < 3; i++) {
        double w, t, l;
        cin >> w >> t >> l;
        a.push_back({w, t, l});
    }

    char results[3] = {'W', 'T', 'L'};
    double Mul = 1.0;
    string bets;

    for (int i = 0; i < 3; i++) {
        double maxNum = max(a[i].w,max(a[i].t, a[i].l));
        Mul *= maxNum;

        if (maxNum == a[i].w) {
            bets += "W ";
        } else if (maxNum == a[i].t) {
            bets += "T ";
        } else {
            bets += "L ";
        }
    }

    double ans = (Mul * 0.65 - 1) * 2;
    cout << bets;
    printf("%.2lf\n", ans);

    return 0;
}

1012:

链接:

1012 The Best Rank - PAT (Advanced Level) Practice (pintia.cn)

题意:

简单来说就是根据询问,给出对应id值的最好名次以及最好名次对应的科目,如果不存在该id就输出N/A

解题思路:

  • 输入与预处理

    • 读取每个学生的ID和他们在C语言、数学、英语的成绩。
    • 计算每个学生的平均成绩。
    • 这里很巧妙就在于我们根据成绩优先级来存入各个成绩,例如score[0]表示平均成绩,score[1]表示c语言的乘积,这样后续就能循环从0~3对各个成绩进行排名
  • 排序与排名

    • 对每个科目(包括平均分、C语言、数学、英语)分别进行排序,按照成绩从高到低为学生排名。相同成绩的学生获得相同排名。
    • 这里有一个很巧妙的地方,就是通过循环,用变量subject对每一个科目进行降序排序
  • 确定最佳排名

    • 对每个学生,找出他在四个排名中的最佳排名(数值最小),并按照优先级(平均分 > C语言 > 数学 > 英语)确定最佳科目。
  • 查询与输出

    • 根据输入的学生ID,输出他们的最佳排名和对应的科目。如果学生不存在,输出“N/A”。
    • 可以通过map来确定id值是否存在
#include <bits/stdc++.h>
using namespace std;
const int N = 2005;

typedef struct {
    string id;
    int best;
    char bestSub;
    int Rank[4], score[4];//四科的排名以及成绩
} node;

node a[N];
map<string, bool> st;
int subject = -1;
char mp[4] = {'A', 'C', 'M', 'E'};

bool cmp(node a, node b) {
    return a.score[subject] > b.score[subject];
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n, m;
    cin >> n >> m;
    
    for (int i = 0; i < n; i++) {
        cin >> a[i].id;
        cin >> a[i].score[1] >> a[i].score[2] >> a[i].score[3];
        a[i].score[0] = (a[i].score[1] + a[i].score[2] + a[i].score[3]) / 3;
        st[a[i].id] = true;
    }

    // 对每个科目进行排名
    for (subject = 0; subject <= 3; subject++) {
        sort(a, a + n, cmp);
        for (int i = 0; i < n; i++) {
            a[i].Rank[subject] = i + 1;
            if (i > 0 && a[i].score[subject] == a[i - 1].score[subject]) {
                a[i].Rank[subject] = a[i - 1].Rank[subject];
            }
        }
    }

    // 确定每个学生的最佳排名
    for (int i = 0; i < n; i++) {
        int maxRank = N;
        char bestSub;
        for (int j = 0; j < 4; j++) {
            if (a[i].Rank[j] < maxRank) {
                maxRank = a[i].Rank[j];
                bestSub = mp[j];
            }
        }
        a[i].best = maxRank;
        a[i].bestSub = bestSub;
    }

    // 查询并输出结果
    for (int i = 0; i < m; i++) {
        string id;
        cin >> id;
        if (st[id]) {
            for (int j = 0; j < n; j++) {
                if (a[j].id == id) {
                    cout << a[j].best << " " << a[j].bestSub << "\n";
                    break;
                }
            }
        } else {
            cout << "N/A\n";
        }
    }

    return 0;
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值