2010.魔法卡牌Ⅱ

题目描述

       在一个遥远的魔法世界里,存在着一种神奇的魔法卡牌,这些卡牌拥有各种强大的法术,可以让持有者在决斗中展现出惊人的力量。LroseC 是一位年轻而雄心勃勃的魔法师。他热衷于收集和使用这些魔法卡牌。他梦想成为最强大的决斗者。一天,LroseC 听说了一个传说中的怪物,据说它拥有无穷的力量,只有真正的决斗大师才能征服它。LroseC 决定接受这个挑战,去寻找这个传说中的怪物。LroseC 踏上了充满危险和冒险的旅程。他穿越森林、沼泽和山脉,一路上遇到了各种挑战和敌人。但他不屈不挠,凭借自己的智慧和魔法卡牌的力量,成功地战胜了一个又一个对手。最终,LroseC 来到了传说中的怪物所在的深渊。他面对着巨大而恐怖的怪物,但他毫不畏惧。
      LroseC 展示出他的最强大的魔法卡牌,释放出惊人的能量。LroseC 与怪物展开了一场惊心动魄的对决。
     LroseC 使用他神奇的卡牌,卡牌和卡牌组合会产生强大的攻击力,这些卡牌上都写有数字,卡牌组合成的攻击力是当前组合卡牌中没有出现过的最小自然数。比如,1−2−3 的卡牌组合攻击力为 0,0−1−2−3 的卡牌组合攻击力为 4 ,(− 表示卡牌组合)。他可以对怪物发动多轮攻击,但是,需要注意的是,组合攻击过的卡牌会消失,也就是说,魔法卡牌都是一次性的。现在 LroseC 手里有 𝑛 张这样的卡牌,他需要你帮助他规划卡牌的组合,从而对怪物产生最大的攻击力,问他产生的攻击力之和最大是多少。

输入

第一行,一个正整数 𝑛,表示 LroseC 拥有的卡牌数量。
接下来一行,𝑛 个非负整数 ,表示 LroseC 拥有的 张魔法卡牌上的数值。

输出

输出一行 , 一个整数,表示答案。

输入样例 复制
【输入样例1】
5
0 0 1 1 2

【输入样例2】
8
1 2 3 4 5 6 7 8
输出样例 复制
【输出样例1】
5

//样例解释1
0-1 产生 2 点攻击力。0-1-2 产生 3 点攻击力,这样的组合是最优的。

【输出样例2】
0
说明

数据范围与提示
对于其中 10% 的数据,𝑎𝑖>0 ;
对于其中 10% 的数据,𝑎𝑖=0 ;
对于另外 20% 的数据,0≤𝑎𝑖≤1 ;
对于 100% 的数据, 1≤𝑛≤10^5,0≤𝑎𝑖≤1000 。

模拟,每个循环扔一个卡牌,所以最大循环数只有10^5,远小于10^9

CODE:

#include<bits/stdc++.h>
using namespace std;
long long n,a[1010],ans;
int main()
{//每次删去一个最长的连续自然数串 
    ios::sync_with_stdio(0);
    cin>>n;
    for(int x,i=1;i<=n;i++)
    {
        cin>>x;
        a[x]++;//用桶储存 
    }
    long long len=n;
    while(len)
    {//打完全部卡牌为止 
        long long l=0,gs=0;//l:进行到第l个数,gs:攻击伤害 
        if(a[0]==0) break;//至少需要一个 0 才能开始进攻 
        while(a[l]!=0)
        {
            a[l]--;//对应减少一张牌 
            len--;//卡牌总量减少 
            gs++;//攻击伤害增加 
            l++;//序列向后一个 
        }
        ans+=gs;//累积攻击 
    }
    cout<<ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值