Description
给出nn个数,两个相同的数字组成一个对子,三个连续的数字组成一个顺子,问最多可以组成多少对子顺子
Input
多组用例,每组用例首先输入一整数nn表示数的个数,之后输入个整数a1,...,ana1,...,an(1≤n≤106,1≤ai≤n)(1≤n≤106,1≤ai≤n)
Output
输出最多可以组成的对子顺子数
Sample Input
7
1 2 3 4 5 6 7
9
1 1 1 2 2 2 3 3 3
6
2 2 3 3 3 3
6
1 2 3 3 4 5
Sample Output
2
4
3
2
Solution
贪心,一个顺子出现两次可以看做是三个对子,故对于每种数字,至多和前面两种数字组成一个顺子,剩下的该种数字全部组成对子即可
Code
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 1000005
int n,a[maxn];
int main()
{
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
int b;
scanf("%d",&b);
a[b]++;
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(i>2&&a[i]&&a[i-1]&&a[i-2])ans++,a[i]--,a[i-1]--,a[i-2]--;
ans+=a[i]/2;
a[i]%=2;
}
printf("%d\n",ans);
}
return 0;
}