题意:给出一个n个数的序列
要求选出一个最长的子序列 可以进行重新排序 形成一个环 要求任意两个数之间 abs<=1
强行贪心加模拟即可
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=2e5+5; int vis[N],cnt[N],n,maxx,L,R; vector<int>table; int main() { RI(n); rep(i,1,n) { int x;RI(x); if(!vis[x])vis[x]=1,table.pb(x); cnt[x]++; } sort(table.begin(),table.end()); maxx=L=R=0; rep(i,0,table.size()-1) { int j=i+1,sum=cnt[table[i]]; while(table[j]-table[j-1]==1&&cnt[table[j]]>1)sum+=cnt[table[j++]]; int cur=j-1; if(table[j]-table[j-1]==1&&cnt[table[j]]==1)cur++,sum++; if(sum>maxx) maxx=sum,L=table[i],R=table[cur]; i=j-1; } cout<<maxx<<endl; if(cnt[L]!=maxx) { while(cnt[L]--) printf("%d ",L); rep(i,L+1,R-1) while(cnt[i]>=2) printf("%d ",i),cnt[i]--; while(cnt[R]--) printf("%d ",R); repp(i,R-1,L+1) if(i!=L+1)printf("%d ",i); else printf("%d",i); } else while(cnt[L]--) if(cnt[L])printf("%d ",L); else printf("%d",L); return 0; }