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;
    }
    
  • 相关阅读:
    作业
    函数
    集合及特殊集合
    VS2010中安装AjaxControlToolkit
    连接SQLServer OLEDB数据库(ACCESS) ODBC Oracle
    设置热键 默认焦距 提交时弹出确认信息
    显示长日期格式时间
    FileUpLoad控件
    按钮类型控件 选择类型控件
    Textbox服务器控件
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324446.html
Copyright © 2011-2022 走看看