• hihocoder1356 分隔相同整数


    题意:

    给你一个序列,让你重新排序,相邻不能相同,且输出字典序最小的

    如果不行输出-1

    思路:

    用map存储每个数字出现的次数

    用set的排序选出次数多的数字

    然后如果当前数字必须要填了就填上,否则填尽可能小的那个

    /* ***********************************************
    Author        :devil
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    typedef long long LL;
    const int inf=0x3f3f3f3f;
    const int mod=998244353;
    const int N=1e5+10;
    int n,a[N];
    map<int,int>mp;
    map<int,int>::iterator it;
    set<pair<int,int> >s;
    vector<int>v;
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            mp[a[i]]++;
        }
        for(it=mp.begin();it!=mp.end();it++)
            s.insert(make_pair(it->second,it->first));
        if((--s.end())->first*2-1>n) printf("-1
    ");
        else
        {
            int pre=-1;
            for(int i=1;i<=n;i++)
            {
                int x;
                if((--s.end())->first*2-1==(n+1-i)) x=(--s.end())->second;
                else
                {
                    it=mp.begin();
                    if(it->first==pre) it++;
                    x=it->first;
                }
                s.erase(make_pair(mp[x],x));
                if(--mp[x]>0) s.insert(make_pair(mp[x],x));
                else mp.erase(x);
                printf("%d%c",x,i==n?'
    ':' ');
                pre=x;
            }
        }
        return 0;
    }
  • 相关阅读:
    ajax异步更新的理解
    Java 中的匿名内部类
    Java 中的方法内部类
    Java 中的静态内部类
    Java 中的成员内部类
    Java 中的 static 使用之静态方法(转)
    构造方法
    成员变量与局部变量的区别
    script标签属性sync和defer
    jsonp原理
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5746214.html
Copyright © 2020-2023  润新知