HDU 6188:Duizi and Shunzi(贪心)(广西邀请赛)

目录

题意

思路

AC代码

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188

题意

有n个数字,每个数字小于等于n,两个相同的数字价值为1,三个连续的数字价值为1 。问这n个数字的最大价值是多少

思路

用map对这n个数字中每个数字出现的次数进行统计,用ans记录总价值。然后从数字1开始向后考虑,如果数字i出现的次数不小于2,那么ans加上数字i出现的次数除以二(两个相同的数字价值为1),然后让这个次数对2取模,接下来判断数字i还有没有(即:是否为1);如果为1,考虑数字i+1出现的次数和i+2出现的次数,如果数字i+1出现了奇数次,并且数字i+1出现过,那么让i,i+1,i+2这三个数字出现的次数全部减一,ans加一,此时数字i已经全部用完了。以此类推,至到n,停止循环(因为这n个数字的大小不会超过n),输出ans

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
int a[maxn];
int main(int argc, char const *argv[])
{
	int n;
	while(~scanf("%d",&n))
	{
		ms(a);
		map<int,int>mmp;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			mmp[a[i]]++;
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			if(mmp[i]>=2)
			{
				ans=ans+mmp[i]/2;
				mmp[i]%=2;
			}
			if(mmp[i]&&(mmp[i+1]%2)&&mmp[i+2])
			{
				ans+=1;
				mmp[i]--;
				mmp[i+1]--;
				mmp[i+2]--;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_123_zy/article/details/81192139