题目描述
在一个遥远的魔法世界里,存在着一种神奇的魔法卡牌,这些卡牌拥有各种强大的法术,可以让持有者在决斗中展现出惊人的力量。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;
}