英雄卡

题目描述

小李非常迷恋收集各种干脆面里面的英雄卡,为此他曾经连续一个月都只吃干脆面这一种零食,但是有些稀有英雄卡真的是太难收集到了。后来某商场搞了一次英雄卡兑换活动,只要你有三张编号连续的英雄卡,你就可以换任意编号的英雄卡。小李想知道他最多可以换到几张英雄卡(新换来的英雄卡不可以再次兑换)。

输入

第一行,共一个整数n(1<=n<=10000),表示小李拥有的英雄卡数。
第二行,共n个空格隔开的数字ai(1<=ai<=100000),表示英雄卡的编号。

输出

输出仅有一行,共1个整数,表示小李最多可以换到的英雄卡。

样例输入

样例数据

6
3 1 2 4 4 5

样例输出

1

提示

1 2 3三张编号连续,可以换一张,换完后剩下4 4 5,不符合兑换规则,无法继续兑换。

思路:用记录加遍历的方式走一遍就可以,详情看注释.

#include<iostream>
using namespace  std;
int main()
{
    int n;
    scanf("%d", &n);
    {
        int card, vis[100005] = { 0 },sum=0;      //vis[]为计数数组
        int maxn = 0;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &card);
            vis[card]++;                            记录编号为card的数目
            maxn = max(maxn, card);                 //找到最大的数   
        }
        for (int i = 1; i < maxn; 
        { i++)           
            if (vis[i] > 0)
            {
                if (vis[i + 1] > 0)                //如果三个连续就记录一下,并将这三张删去
                {
                    if (vis[i + 2] > 0)                
                    {
                        sum++;
                        vis[i]--;
                        vis[i + 1]--;               
                        vis[i + 2]--;
                        i--;                    //i--   回去一次防止有多张的情况(懒得写if了)
                    }
                }
            }
        }
        printf("%d\n", sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30253757/article/details/84930643