zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    排序算法<四>希尔排序
    排序算法<三>快速排序
    排序算法<二>冒泡排序
    排序算法<一>选择排序
    相信我这是水题ny1313
    斐波那契查找
    插值查找
    第四届蓝桥杯c/c++B组4
    如何使用NPM来管理你的Node.js依赖
    javascript深入学习
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324446.html
Copyright © 2011-2022 走看看