2017广西邀请赛 G Duizi and Shunzi(贪心)

xiaoxiao2021-02-28  33

题目链接:Duizi and Shunzi 题意:问给出一组数,求max(对子数+顺子数)。约定,每个数只能用一次,对子长度为2,顺子长度为3。如22是一对对子,123是一对顺子。 思路:很容易想到一个思路,对子长度比顺子长度短,优先组合成对子。看1123这个序列,11对子或者123顺子,优先组合对子(反正对子顺子1比1的关系,后面存在未知,先把前面的合并起来);看1223这个序列,22对子或者123顺子,优先组合对子(道理同样的);但是,看1233这个序列例外,应该优先组合顺子,若组合对子33剩下12,若组合顺子123剩下3,假如1233后面有45的话3就发挥作用了。所以具体实现请看代码:

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<cmath> #include<map> #include<set> #include<cstdlib> #define mem(a,b) memset(a,b,sizeof(a)) typedef long long ll; using namespace std; const int maxn = 1e6+10; int t; int num[maxn]; int main(){ ll n; while(~scanf("%lld",&n)){ mem(num,0); for(int i = 0 ; i < n; i++){ scanf("%d",&t); num[t]++; } int ans = 0; for(int i = 1; i <= n; i++){ ans += num[i]/2; num[i] %= 2; if(i <= n-2){ if(num[i] == 1 && num[i+1]%2 == 1 && num[i+2]){ ans++; num[i]--; num[i+1]--; num[i+2]--; } } } printf("%d\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-600134.html

最新回复(0)