传送门
题意:给你一串序列,两个一样的是对子,连续的三个是顺子,求顺子个数和对子个数的最大值。
思路:从小到大贪心,先看自己能组成的对子有多少个,如果最后还余了1,那就考虑顺子,假设当前数为x,但这里的条件是num[x+1]%2==1 && num[x+2] ,就是能不用后面的就不用后面的,因为后面的数可能还会对后面的组合造成贡献。
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define SZ(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-9;
int n,x;
int main(){
std::ios::sync_with_stdio(0);
while(cin>>n){
map<int,int> mp;
rep(i,1,n) cin>>x,mp[x]++;
int ans=0;
for(auto it=mp.begin();it!=mp.end();){
ans+=it->se/2,it->se%=2;
if(it->se!=0){
int np=it->fi;
if(mp[np+1]%2==1 && mp[np+2]){
ans++;
it->se--,mp[np+1]--,mp[np+2]--;
}
}
++it;
}
cout<<ans<<endl;
}
return 0;
}