https://vjudge.net/contest/285413#problem/A
首先明确一点,组成对子只需要两张牌,组成顺子需要三张牌。所以先组成对子
由上图分析,考虑思路为先组成对子,再看他的下一个是否为奇数,再看下下个是否不为0
ac代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[1000010];
int main(){
int n;
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
int x,maxa=0,maxb=0;
for(int j=0;j<n;j++){
cin>>x;
a[x]++;
}
//先看对子,再看顺子
for(int i=1;i<=n;i++){
maxa+=a[i]/2;
a[i]%=2;
if(i<=n-2){
if(a[i]==1&&a[i+1]%2!=0&&a[i+2]>0){
maxa++;
a[i]--;
a[i+1]--;
a[i+2]--;
}
}
}
cout<<maxa<<endl;
}
return 0;
}
暴力,还没ac
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[1000010],b[1000010];
int main(){
int n;
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int x,maxa=0,maxb=0;
for(int j=0;j<n;j++){
cin>>x;
a[x]++;
b[x]++;
}
//先看对子,再看顺子
for(int i=1;i<=n;i++){
maxa+=a[i]/2;
a[i]%=2;
}
for(int i=2;i<=n-1;i++){
if(a[i-1]>0&&a[i]>0&&a[i+1]>0){
int fff=min(a[i-1],min(a[i],a[i+1]));
maxa+=fff;
a[i-1]-=fff;
a[i]-=fff;
a[i+1]-=fff;
}
}
//先看顺子再看对子
for(int i=2;i<=n-1;i++){
if(b[i-1]>0&&b[i]>0&&b[i+1]>0){
int fff=min(b[i-1],min(b[i],b[i+1]));
maxb+=fff;
b[i-1]-=fff;
b[i]-=fff;
b[i+1]-=fff;
}
}
for(int i=1;i<=n;i++){
maxb+=b[i]/2;
b[i]%=2;
}
cout<<max(maxa,maxb)<<endl;
}
return 0;
}