今天看了大佬们的博客,菜鸡感到瑟瑟发抖,只有持之以恒的边学边练才能有成效呀!!!
每日至少一题 加油鸭!!!
题目链接:https://vjudge.net/problem/HDU-6188
分析:
由于题目要求中顺子是三张牌组成,这道题只需要三个数三个数地考虑即可。内存给的比较大,可以在存入数据时用数组计数,下标为每次读入的数,内容为这个数出现的个数,这样可以直接无视数字输入的顺序。在这道题中,要找出顺子和对子最多的情况,就需要在两种都有的情况下优先考虑对子(因为对子只需要两张,而顺子要三张)。先看前两种牌的数量,若能凑成对子则优先凑对子,然后从这两类牌的总数中减掉已经凑好的牌。从第三种牌开始,先看能不能与它的前两种牌凑成顺子以利用起来之前可能会浪费的牌,再考虑这种牌自己凑对子的情况。每次开始新的循环时一定记得清空数组。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 1000005
int a[maxn];
int main()
{
int n;
while(~scanf("%d", &n)){
int x, ans = 0;
memset(a, 0, sizeof(a));
for(int i = 0; i < n; i++){
scanf("%d", &x);
a[x]++;
}
for(int i = 1; i <= n; i++){
if(i <= 2){
ans += a[i] / 2;
a[i] %= 2;
}else{
if(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);
}
}