Description
要求用n个不同的字母构造一个串,给出串中每种字母出现次数的上限,并要求串中出现过的字母的数量都不同,问串长最多是多少
Input
一个整数n表示字母种数,之后为n个整数ai表示每种字母在串中出现次数使得上限(2<=n<=26,1<=ai<=10^9)
Output
输出最长串长
Sample Input
3
2 5 5
Sample Output
11
Solution
贪心,尽量多的用字母
Code
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
int n,a[33];
map<int,int>m;
int main()
{
while(~scanf("%d",&n))
{
m.clear();
for(int i=0;i<n;i++)
scanf("%d",&a[i]),m[a[i]]++;
ll ans=0;
for(int i=0;i<n;i++)
{
int t=a[i];
if(m[t]>1)
{
m[t]--,t--;
while(m[t])t--;
}
m[t]++;
if(t>0)ans+=t;
}
printf("%I64d\n",ans);
}
return 0;
}