「杂题乱刷」CF624B

原题链接

CF624B Making a String

题目简述

现在有 \(n\) 个字母,要将这些字母拼成一个尽可能长的字符串,但是每个字母出现的次数不能相等,求这个字符串长度的最大值。

解题思路

首先输入 \(n\),再输入每个字母出现的次数,最后建造一个桶,存储桶内的每个数字,使得桶内每个数字不相同的情况下桶内的数字之和最大,但是,需要注意的是,桶内的数字最少为 \(0\),而不是负数。

参考代码

#include<bits/stdc++.h>
using namespace std;
#define QWQ return 0
long long a[1000010],n,sum,ans;//n表示有几个字母,sum表示存储单个字母的答案,ans存储最终答案
int main()
{
	cin>>n;//输入n
	for(long long i=0;i<n;i++)
		cin>>a[i];//输入每个字母出现了多少次
	sort(a,a+n);//快排a数组
	sum+=a[n-1]+1;
	for(long long i=n-1;i>=0;i--)//为防止出现重复,从大到小枚举
	{
	    if(sum>a[i])//如果sum大于a[i]的话,则桶中的元素无需减少
	    	sum=a[i];
	    else if(sum)//否则桶中的元素减少1
	    	sum--;
	    ans+=sum;//ans增加桶中的元素
	}
	cout<<ans<<endl;//输入答案
    QWQ;//华丽的结束
}

posted @ 2023-11-23 20:21  wangmarui  阅读(6)  评论(0编辑  收藏  举报