PTA乙级题 1080. MOOC期终成绩 (25)
【题目链接】
最后一个点运行超时,询问大佬后得知,匹配名字处(即41行和55行处)过于复杂,第一个代码容易理解,但运行超时,第二个代码AC了。
#include<stdio.h>
#include<string.h>
typedef struct node
{
char id[
25];
int a;
int b;
int c;
int sum;
}Node;
int main()
{
int x=
0,score,i,j,q,w,e;
char ID[
25];
scanf(
"%d %d %d",&q,&w,&e);
getchar();
Node s[q],temp;
for (i=
0;i<q;i++)
{
memset(ID,
0,
sizeof(ID));
scanf(
"%s %d",ID,&score);
if (score>=
200)
{
strcpy(s[x].id,ID);
s[x].a=score;
x++;
}
}
for (i=
0;i<x;i++)
{
s[i].b=-
1;
s[i].c=-
1;
}
for (i=
0;i<w;i++)
{
memset(ID,
0,
sizeof(ID));
scanf(
"%s %d",ID,&score);
for (j=
0;j<x;j++)
{
if (
strcmp(ID,s[j].id)==
0)
{
s[j].b=score;
break;
}
}
}
for (i=
0;i<e;i++)
{
memset(ID,
0,
sizeof(ID));
scanf(
"%s %d",ID,&score);
for (j=
0;j<x;j++)
{
if (
strcmp(ID,s[j].id)==
0)
{
s[j].c=score;
break;
}
}
}
for (i=
0;i<x;i++)
{
if (s[i].b>s[i].c)
s[i].sum=s[i].b*
0.4+s[i].c*
0.6+
0.5;
else
s[i].sum=s[i].c;
}
for (i=
0;i<x-
1;i++)
{
for (j=
0;j<x-
1-i;j++)
{
if (s[j].sum<s[j+
1].sum||(s[j].sum==s[j+
1].sum&&
strcmp(s[j].id,s[j+
1].id)>
0))
{
temp=s[j];
s[j]=s[j+
1];
s[j+
1]=temp;
}
}
}
for (i=
0;i<x;i++)
{
if (s[i].sum>=
60)
printf(
"%s %d %d %d %d\n",s[i].id,s[i].a,s[i].b,s[i].c,s[i].sum);
}
}
下面是芥末三文鱼提供的满分C++代码,有兴趣的同学可以研究一下。
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
#include <array>
using namespace std;
int main() {
ios::sync_with_stdio(
false);
size_t counts[
3];
map<string, array<int, 4>> m;
cin >> counts[
0] >> counts[
1] >> counts[
2];
for (size_t i =
0; i <
3; i++)
for (size_t j =
0; j < counts[i]; j++) {
string name;
array<int, 4> value = { -
1, -
1, -
1 };
cin >> name >> value[i];
if (i ==
0)
m.emplace(make_pair(name, value));
else {
auto result = m.find(name);
if (result != m.end())
result->second[i] = value[i];
else
m.emplace(make_pair(name, value));
}
}
vector<pair<string, array<int, 4>>> v(m.begin(), m.end());
for (
auto i = v.begin(); i != v.end(); i++) {
if (i->second[
1] > i->second[
2]) {
double middle = i->second[
1] == -
1 ?
0 : i->second[
1];
double final = i->second[
2] == -
1 ?
0 : i->second[
2];
double sum = (
0.4 * middle) + (
0.6 * final);
i->second[
3] = (
int)sum + (sum - (
int)sum >
0.5 ?
1 :
0);
}
else
i->second[
3] = i->second[
2];
}
sort(v.begin(), v.end(), [](pair<
string,
array<int, 4>> a, pair<
string,
array<int, 4>> b) {
if (a.second[
3] != b.second[
3])
return isgreater(a.second[
3], b.second[
3]);
else
return a.first < b.first;
});
for (
auto i : v) {
if (i.second[
3] >=
60 && i.second[
0] >=
200) {
cout << i.first;
for (
auto j : i.second)
cout <<
" " << j;
cout << endl;
}
}
return 0;
}