PTA乙级题 1085. PAT单位排行 (25)
【题目链接】
自己写的代码最后两个测试点5分运行超时,题目给的数据量是真的大。
#include<iostream>
#include<string>
#include<map>
#include<cctype>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct
{
string type;
double score;
string name;
}NODE;
typedef struct
{
int flag;
string school;
double data;
int count;
}node;
int cmp(node a, node b)
{
if (a.data != b.data)
return a.data > b.data;
if (a.count != b.count)
return a.count < b.count;
return a.school < b.school;
}
int main()
{
map<string, int>M;
int i, n, x = 1;
cin >> n;
NODE stu[n+1];
node sch[n+1];
for (i = 0; i<n; i++)
{
cin >> stu[i].type >> stu[i].score >> stu[i].name;
for (size_t j = 0; j<stu[i].name.size(); j++)
stu[i].name[j] = tolower(stu[i].name[j]);
if (M[stu[i].name] == 0)
{
M[stu[i].name] = x;
sch[x].school = stu[i].name;
sch[x].count = 1;
switch (stu[i].type[0])
{
case 'A':
sch[x].data = stu[i].score;
break;
case 'B':
sch[x].data = (int)(stu[i].score / 1.5);
break;
case 'T':
sch[x].data = (int)(stu[i].score*1.5);
break;
}
x++;
}
else
{
sch[M[stu[i].name]].count++;
switch (stu[i].type[0])
{
case 'A':
sch[M[stu[i].name]].data += stu[i].score;
break;
case 'B':
sch[M[stu[i].name]].data += (int)(stu[i].score / 1.5);
break;
case 'T':
sch[M[stu[i].name]].data += (int)(stu[i].score*1.5);
break;
}
}
}
sort(sch + 1, sch + x, cmp);
cout << x - 1 << endl;
for (i = 1; i < x; i++)
{
if (i == 1)
sch[i].flag = i;
else
{
if (sch[i].data == sch[i - 1].data)
sch[i].flag = sch[i - 1].flag;
else
sch[i].flag = i;
}
cout << sch[i].flag << " " << sch[i].school << " ";
printf("%d", (int )(sch[i].data));
cout << " " << sch[i].count << endl;
}
}
水平有限,转一下柳婼小姐姐的AC代码。
#include <iostream>
#include <algorithm>
#include <cctype>
#include <vector>
#include <map>
using namespace std;
struct node {
string school;
int tws, ns;
};
bool cmp(node a, node b) {
if (a.tws != b.tws)
return a.tws > b.tws;
else if (a.ns != b.ns)
return a.ns < b.ns;
else
return a.school < b.school;
}
int main() {
int n;
scanf("%d", &n);
map<string, int> cnt;
map<string, double> sum;
for (int i = 0; i < n; i++) {
string id, school;
cin >> id;
double score;
scanf("%lf", &score);
cin >> school;
for (int j = 0; j < school.length(); j++)
school[j] = tolower(school[j]);
if (id[0] == 'B')
score = score / 1.5;
else if (id[0] == 'T')
score = score * 1.5;
sum[school] += score;
cnt[school]++;
}
vector<node> ans;
for (auto it = cnt.begin(); it != cnt.end(); it++)
ans.push_back(node{it->first, (int)sum[it->first], cnt[it->first]});
sort(ans.begin(), ans.end(), cmp);
int rank = 0, pres = -1;
printf("%d\n", (int)ans.size());
for (int i = 0; i < ans.size(); i++) {
if (pres != ans[i].tws) rank = i + 1;
pres = ans[i].tws;
printf("%d ", rank);
cout << ans[i].school;
printf(" %d %d\n", ans[i].tws, ans[i].ns);
}
return 0;
}