2 条题解

  • 0
    @ 2026-7-20 1:42:57

    P1059 明明的随机数——题解

    思路

    数字范围只有 1110001000,可以建立布尔数组 vis

    • 读到数字 x 时,把 vis[x] 设为真;
    • 输入结束后,从 1110001000 顺序扫描;
    • vis[i] 为真说明数字 ii 出现过,只统计和输出一次。

    顺序扫描本身就完成了从小到大的排序。

    复杂度

    时间复杂度 O(N+1000)O(N+1000),空间复杂度 O(1000)O(1000)

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    bool vis[1001];
    
    int main() {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            vis[x] = true;
        }
    
        int cnt = 0;
        for (int i = 1; i <= 1000; i++)
            if (vis[i]) cnt++;
    
        cout << cnt << '\n';
        bool first = true;
        for (int i = 1; i <= 1000; i++) {
            if (vis[i]) {
                if (!first) cout << ' ';
                cout << i;
                first = false;
            }
        }
        cout << '\n';
        return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:57

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

      • 1

      信息

      ID
      4948
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者