1012 The Best Rank (25 分)难度: 中 / 知识点: 排序 前缀和
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1012 The Best Rank (25 分)难度: 中 / 知识点: 排序 前缀和相关的知识,希望对你有一定的参考价值。
https://pintia.cn/problem-sets/994805342720868352/problems/994805502658068480
解析: 这里的每一项排名有一个坑的点,就是 100 100 95 这种 100并列第一 95为第三
题目说实话有点含糊不全。
那么如何处理这种并列情况呢? 用前缀和,求[(当前分数+1)-100]
这一段区间有几个人 代表你的前面有多少人。你的排名就是区间人数+1
#include<bits/stdc++.h>
using namespace std;
const int N=1e3*3+10;
struct node
{
string name;
int a[4];//A,C,M,E
int index;//排名
int ans;//答案是哪一项
}Node[N];
int n,m;
char c[5]={'A','C','M','E'};
map<string,node>mp;//查询
map<string,int>hush;//判断是否有这个人
int ve[5][105];
bool cmp(int a,int b) {return a>b;}
void f1(int d)//将所选的成绩,求前缀和
{
int s=0;
for(int i=0;i<=100;i++) ve[d][i]=s+ve[d][i],s=ve[d][i];
}
node f2(node x)
{
int b[10];
x.index=1e9;
for(int i=0;i<4;i++)//枚举4个成绩 找到最小的排名
{
b[i]=ve[i][100]-ve[i][x.a[i]]+1;
}
for(int i=0;i<4;i++) if(x.index>b[i]) x.index=b[i],x.ans=i;
return x;
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>Node[i].name>>Node[i].a[1]>>Node[i].a[2]>>Node[i].a[3];
Node[i].a[0]=(Node[i].a[1]+Node[i].a[2]+Node[i].a[3])/3.0+0.5;
Node[i].index=1e9;
ve[0][Node[i].a[0]]++;
ve[1][Node[i].a[1]]++;
ve[2][Node[i].a[2]]++;
ve[3][Node[i].a[3]]++;
}
f1(0),f1(1),f1(2),f1(3);//求前缀和
for(int i=0;i<n;i++)//枚举每一个学生
{
Node[i]=f2(Node[i]);//找到最佳排名
mp[Node[i].name]=Node[i];
hush[Node[i].name]=1;//标记有这个学生
}
while(m--)
{
string s; cin>>s;
if(hush[s]) cout<<mp[s].index<<" "<<c[mp[s].ans]<<endl;
else puts("N/A");
}
return 0;
}
以上是关于1012 The Best Rank (25 分)难度: 中 / 知识点: 排序 前缀和的主要内容,如果未能解决你的问题,请参考以下文章
1012 The Best Rank (25分) vector与结构体排序
PAT Advanced 1012 The Best Rank (25分)
[PTA] PAT(A) 1012 The Best Rank (25 分)