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;
}