英雄卡

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

输入
第一行,共一个整数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 <bits/stdc++.h>
using namespace std;
int minz(int a,int b,int c)
{
    return min(min(a,b),c);
}
int main()
{
    int a[100005]={0},n,x,ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        a[x]++;
    }for(int i=1;i<=100000;i++){
        if(a[i]>=1&&a[i+1]>=1&&a[i+2]>=1){
            x=minz(a[i],a[i+1],a[i+2]);
            ans+=x;
            a[i]-=x;a[i+1]-=x;a[i+2]-=x;
        }
    }printf("%d\n",ans);
    return 0;
}

思路很简单,就是号数存为下标,遇到连续的就减最小的数目。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是描述一个人收集各种干脆面的英雄的故事,他曾连续一个月只吃干脆面这一种零食,但有一些片却很难找到。后来某商场搞了一次英雄兑换活动,你只需要有三张连续编号的英雄,就可以换取任意编号的英雄。小明想知道他最多可以换到几张英雄(新换来的英雄不可再次兑换)。 ### 回答2: 小明想要最多换到的英雄数量,其实就是最长的连续英雄序列的长度。如果我们将所有英雄的编号按照从小到大的顺序排列,那么只需要找到最长的连续子序列即可。比如说,假设小明收集到了以下十二张英雄: 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15 我们可以将它们按照编号从小到大排列,得到: 1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15 然后,我们可以使用一些算法来找到最长的连续子序列。一种比较简单的方式是使用双指针法。我们维护两个指针 left 和 right,分别指向当前连续子序列的起始和终止位置。我们不断向右移动 right 指针,直到遇到一个不连续的位置,此时我们就找到了一个连续子序列。记录该子序列的长度,然后将 left 指针右移一个位置,重新开始查找下一个连续子序列。 在上面的例子中,我们可以依次找到以下连续子序列: 1, 2, 3 5, 6, 7, 8 10, 11, 12, 13 其中最长的连续子序列为 5, 6, 7, 8,长度为 4,也就是小明可以兑换到的最多英雄数量。当然,如果小明收集的英雄中没有连续的三张编号,那么他就无法参加兑换活动了。 ### 回答3: 小明要想换到最多的英雄,就要先收集到尽可能多的编号连续的英雄。假设小明手中已经有了n张编号连续的英雄,他就可以利用这n张英雄来换取更多的英雄。 假设小明手中的英雄编号为a1, a2, a3,………an。为了得到尽可能多的英雄,小明的兑换策略应该是换取距离他现有英雄编号最近的编号连续的三张英雄。假设他换取了编号连续为b1, b2, b3的英雄,那么小明新增的英雄数量就是3-1=2张,因为小明已经有了a1, a2, a3这三张英雄。 接下来,小明手中的英雄编号就变成了a1, a2, a3, b1, b2, b3。后面的英雄就可以继续按照这个策略来换取,直到不能再换为止。 假设小明一共收集到了m张英雄,并且收集到了k组编号连续的三张英雄,那么小明最多可以换到的英雄数量为m+k*2。因为小明在每次兑换时可以获取两张新的英雄,而兑换次数是k次。 因此,小明最多可以换到的英雄数量为收集到的英雄总数加上连续三张编号的英雄组数乘以2,即: 最多换到的英雄数量 = m + k*2 这就是小明最多可以换到的英雄数量的公式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值