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


    题目链接: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
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    幸福必读
    JAVA程序员之路
    编写数据库操作类,使ASP.NET 中的数据库操作变得简单
    Duwamish 7.0 系列分析文章
    Visual Studio .NET加密技术剖析系列课程
    做为一个Tester,你为Testing付出了多少?
    程序员分成几种不同的境界
    深度探索C++对象模型(2).txt
    Eclipse快速上手指南之使用JUnit
    Eclipse使用技巧
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324446.html
Copyright © 2020-2023  润新知