1 条题解

  • 0
    @ 2026-10-18 23:28:33

    [NOIP 2006 普及组] 明明的随机数

    知识点

    去重、标记数组、桶排序

    解题思路

    建立1001个布尔标记,读到x就标记x出现。遍历1到1000统计出现过的数有多少个,再按同样顺序输出所有被标记的数。

    正确性说明

    输入值x的标记为真当且仅当它至少出现一次,重复出现不改变标记。按值从小到大扫描恰好输出每个不同值一次,因此同时满足去重与升序。

    易错点

    先输出不同数字个数,再输出数字;1000也是合法上界;原输入个数N可能大于不同数个数;相同值不能重复计数。

    复杂度

    时间O(N+1000),空间O(1000)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int n;cin>>n;bool seen[1001]={};while(n--){int x;cin>>x;seen[x]=true;}int cnt=0;for(int x=1;x<=1000;++x)cnt+=seen[x];cout<<cnt<<'\n';bool first=true;for(int x=1;x<=1000;++x)if(seen[x]){if(!first)cout<<' ';first=false;cout<<x;}cout<<'\n';}
    
    • 1

    [NOIP 2006 普及组] 明明的随机数

    信息

    ID
    381
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者