距离相等的条形码

代码 & 题解总结

1. 题目要求

给定 n 个数,先按出现次数从多到少排序,次数相同则小数在前;再把排好的数先填满数组奇数下标,再填偶数下标,输出最终序列。

2. 代码核心四步

  1. 桶计数cnt[x]统计每个数字出现次数;
  2. 自定义排序cmp优先频次降序,同频次数值升序;
  3. 隔位填充:用 pos 从 1 开始,每次 + 2,超出长度就切换到 2,依次填充奇数位、偶数位;
  4. 输出答案数组 ans

3. 复杂度

排序主导,总时间复杂度 (O(n\log n)),适配 n≤10005 的数据范围。

4. 关键考点

桶计数、sort 自定义比较函数、奇偶位置分开放置的模拟技巧。

5. 优缺点简记

优点:逻辑简单、模板通用; 缺点:固定数组有越界风险,无法适配超大数值 / 数据量。

#include<bits/stdc++.h>
using namespace std;
int a[10005], ans[10005];
int cnt[10005];
bool cmp(int x, int y) {
    if(cnt[x] != cnt[y])
        return cnt[x] > cnt[y];
    return x < y;
}
int main() {
    int n;
    cin>>n;
    memset(cnt,0,sizeof cnt);
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        cnt[a[i]]++;
    }
    sort(a+1,a+1+n,cmp);
    int pos = 1;
    for(int i=1;i<=n;i++){
        ans[pos] = a[i];
        pos += 2;
        if(pos > n) pos = 2;
    }
    for(int i=1; i<=n; i++) {
        cout<<ans[i]<<" ";
    }
    return 0;
}