广西邀请赛的一道题,按出题人来说是一道签到题,重现赛的时候在这道题上卡了很久,一上来以为是dp,怎么都推不出公式。后来看看题解,发现和我dp时思路是一样的,改成贪心就对了。 贪心思路: 当前数能作为某个顺子的最大值,则取顺子; 否则能取对子,则取对子。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100005; int n,a[maxn]; int cal(int mx) { int sum = 0; for(int i=1; i<=mx; i++) { if(a[i-2]>0 && a[i-1]>0 && a[i]>0 && i>=3) { sum++; a[i]--; a[i-1]--; a[i-2]--; } sum += a[i]/2; a[i] %= 2; } return sum; } int main() { while(scanf("%d",&n) !=EOF) { memset(a, 0, sizeof(a)); int mx = 0; for(int i=0; i<n; i++) { int t; scanf("%d",&t); if(mx < t) mx = t; a[t]++; } printf("%d\n",cal(mx)); } return 0; }