题目大意: 通过任意排序,让数列的 min(最大上升,下降子序列)的值最大
思路:
- 将数分为3种类型, 上升的,下降的,2者都可以的. 贪心的让 2者都可以的数多
- 对于重复出现的数,放在2者都可以的
- 对于单个出现的数,可以选着一个数,让他成为2者的公共数,
- 所以就是 asn+num/2(向上去整数)
// 15.26 #include <bits/stdc++.h> using namespace std; #define ri register int #define M 200005 int n,m; int T; int p[M]; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while(T--) { cin>>n; for(ri i=1;i<=n;i++) cin>>p[i]; sort(p+1,p+1+n); if(n==1) { cout<<1<<endl; continue; } int flag=0; int num=0,ans=0; for(ri i=2;i<=n;i++) { if(p[i]!=p[i-1]) { if(flag==0) { num++; } else { ans++; } flag=0; } else { flag=1; } } if(flag==0) { num++; } else { ans++; } if(num&1) { cout<<ans+num/2+1<<endl; continue; } cout<<ans+num/2<<endl; } return 0; }