「杂题乱刷」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 @   wangmarui  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示