2 条题解

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

    P1097 统计数字——题解

    思路

    把所有数放入数组后排序。排序完成后,相同数字一定连续出现。

    从左到右扫描:

    • 记录当前数字 a[i]
    • 继续向右找到第一个与它不同的位置;
    • 两个位置之差就是该数字出现的次数;
    • 输出后继续处理下一段。

    复杂度

    排序时间复杂度 O(nlogn)O(n\log n),扫描为 O(n)O(n),空间复杂度 O(n)O(n)

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    long long a[200005];
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        sort(a + 1, a + n + 1);
    
        int i = 1;
        while (i <= n) {
            int j = i;
            while (j <= n && a[j] == a[i]) j++;
            cout << a[i] << ' ' << j - i << '\n';
            i = j;
        }
        return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:58

      #include <bits/stdc++.h> using namespace std; long long a[200005]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int i=1; while(i<=n){ int j=i; while(j<=n&&a[j]==a[i]) j++; cout<<a[i]<<' '<<j-i<<'\n'; i=j; } return 0; }

      • 1

      信息

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