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 分)

1012 The Best Rank (25分) vector与结构体排序

PAT Advanced 1012 The Best Rank (25分)

[PTA] PAT(A) 1012 The Best Rank (25 分)

PAT-1012 The Best Rank (25 分) 查询分数对应排名(包括并列)

1012 The Best Rank (25 分)难度: 中 / 知识点: 排序 前缀和