(HDU) 6188 G - Duizi and Shunzi (贪心)

传送门

题意:给你一串序列,两个一样的是对子,连续的三个是顺子,求顺子个数和对子个数的最大值。

思路:从小到大贪心,先看自己能组成的对子有多少个,如果最后还余了1,那就考虑顺子,假设当前数为x,但这里的条件是num[x+1]%2==1 && num[x+2] ,就是能不用后面的就不用后面的,因为后面的数可能还会对后面的组合造成贡献。


#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define SZ(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define drep(i,a,b)	for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-9;
int n,x;
int main(){
	std::ios::sync_with_stdio(0);
	while(cin>>n){
		map<int,int> mp;
		rep(i,1,n)	cin>>x,mp[x]++;
		int ans=0;
		for(auto it=mp.begin();it!=mp.end();){
			ans+=it->se/2,it->se%=2;
			if(it->se!=0){
				int np=it->fi;
				if(mp[np+1]%2==1 && mp[np+2]){
					ans++;
					it->se--,mp[np+1]--,mp[np+2]--;
				}
			}
			++it;
		}
		cout<<ans<<endl;
	}
	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值