题意:
在给出的n个数中选择一部分数,问能组成的最长回文数组长度是多少。
题解:
取出每一个数出现次数的偶数部分作为回文串两边元素相加,最后加上可能存在的出现一次的中间位置即可。
#include<bits/stdc++.h>
using namespace std;
map<int,int> s;
int n;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
++s[x];
}
bool odd=false;
int ans=0;
for(auto x:s){
if(x.second&1){
odd=true;
}
//这里代表将偶数部分乘二,为整数乘法是向下取整的
ans+=(x.second/2)*2;
}
ans+=odd;
printf("%d",ans);
return 0;
}