题意:已知n个数,要求构成一个数列,使得构成数列中一个数最大 ,往两边依次严格递减 , 问这个数列最长多长并且输出该数列。

思路:最大的放中间,第二大的往两边放,以此类推。 实现过程:用map来计数,计数完成后复制给struct。这样的好处是可以节约很多不必要的空间消耗。然后开一个数组来模拟第一句话的思路。用left,right标记左边和右边的下标。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn=1e5+50;
int ans[3*maxn];
map <int,int> mp;
struct node
{
    int v,cnt;
}d[maxn];

int main(void)
{
    int m;
    cin >> m;
    for(int i=1;i<=m;i++)
    {
        int x;
        scanf("%d",&x);
        mp[x]++;
    }
    int cnt=1;
    for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++)
        d[cnt].v=it->first, d[cnt].cnt=it->second,cnt++;
    //for(int i=1;i<cnt;i++)
    // printf("%d %d\n",d[i].v,d[i].cnt);
    int index=150000,left=150000,right=150000;
    ans[index]=d[cnt-1].v;
    left--,right++;
    for(int i=cnt-2;i>=1;i--)
    {
        if(d[i].cnt==1)
            ans[left--]=d[i].v;
        else if(d[i].cnt >=2)
            ans[left--]=ans[right++]=d[i].v;
    }
    printf("%d\n",(right-1)-(left+1)+1);
    for(int i=left+1;i<=right-1;i++)
        printf("%d ",ans[i]);
    printf("\n");
}