zoukankan      html  css  js  c++  java
  • 分隔相同整数

    分隔相同整数

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定一个包含N个整数的数组A。你的任务是将A重新排列,使得任意两个相等的整数在数组中都不相邻。  

    如果存在多个重排后的数组满足条件,输出字典序最小的数组。  

    这里字典序最小指:首先尽量使第一个整数最小,其次使第二个整数最小,以此类推。

    输入

    第一行包含一个整数N,表示数组的长度。(1 <= N <= 100000)  

    第二行包含N个整数,依次是 A1, A2, ... AN。(1 <= Ai <= 1000000000)

    输出

    输出字典序最小的重排数组。如果这样的数组不存在,输出-1。

    样例输入
    4  
    2 1 3 3
    样例输出
       1 3 2 3
    分析:转自http://www.gotit.sinaapp.com/author/ictlxb.html(ictlxb)
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #include <bitset>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define vi vector<int>
    #define pii pair<int,int>
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    const int maxn=1e5+10;
    const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,k,t,pre;
    set<pii> st;
    map<int,int>::iterator iter;
    map<int,int> a;
    vector<int> ans;
    int main()
    {
        int i,j;
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&j),++a[j];
        for(pii x:a)st.insert(mp(x.se,x.fi));
        pre=-1;
        while(n)
        {
            iter=a.find(st.rbegin()->se);
            if(iter->se*2-1>=n)
            {
                if(iter->fi==pre)
                    return 0*puts("-1");
            }
            else
            {
                iter=a.begin();
                if(iter->fi==pre)iter++;
            }
            ans.pb(iter->fi);
            pre=iter->fi;
            st.erase(mp(iter->se,iter->fi));
            iter->se--;
            if(iter->se==0)a.erase(iter);
            else st.insert(mp(iter->se,iter->fi));
            n--;
        }
        printf("%d",ans[0]);
        rep(i,1,ans.size()-1)printf(" %d",ans[i]);
        printf("
    ");
        //system ("pause");
        return 0;
    }
  • 相关阅读:
    C# 下 WebService 初探: 构建Web Service 服务及 WinForm和浏览器 httpget调用
    Action<T> 泛型委托 在跨线程访问控件委托中的应用
    C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
    DOS下的批处理文件(老东西了)
    typedef struct和struct定义结构体的区别
    多线程idhttp下载文件源代码
    JQUERY获取DOM对象
    学习笔记:delphi实现网络通信之select模型
    学习笔记之WSAAsyncSelect模式
    delphi 函数指针 方法指针
  • 原文地址:https://www.cnblogs.com/dyzll/p/5752866.html
Copyright © 2011-2022 走看看