专栏文章

题解:AT_joisc2007_score 得点 (Score)

AT_joisc2007_score题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqabxir
此快照首次捕获于
2025/12/04 01:32
3 个月前
此快照最后确认于
2025/12/04 01:32
3 个月前
查看原文

题目涉及算法

计数思想。

大致题意

输入 nn01000 ~ 100 之间的整数,将它们从大到小排序,输出它们的排名(输入顺序输出)。
注意事项:
相同的整数名次相同,因此可能存在中间某个名次没有对应的整数。

思路解析

使用计数思想,将 to[i]to[i] 作为 ii 在数列中存在的次数。
再次让 ii 遍历 1n1 \sim n 每次从 a[i]+1a[i]+1 找到 100100 (最大值),将它们的 toto 数组累加,最后加上 11 (最大的数是第 11 名而不是第 00 名)。输出它们的加和。
详见以下代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int a[100010],to[110];//只有100个数,to数组开100。
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        to[a[i]]++;//计数
    }
    for(int i=1;i<=n;i++)
    {
        int cnt=1;//从第一名开始
        for(int j=a[i]+1;j<=100;j++) cnt+=to[j];
        cout<<cnt<<endl;
    }
    return 0;
}
时间复杂度: O(100n)O(100n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...