CodeForces 624 B. Making a String(贪心)

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;
}

你可能感兴趣的:(CodeForces 624 B. Making a String(贪心))