桶排:拆分

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

往 {\color{Red} {\Huge 往} } 期 {\color{Green} {\Huge 期} } 文 {\color{Blue} {\Huge 文} } 章 {\color{Orange} {\Huge 章}}


此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲 1100 粉 {\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} } 偷偷告诉你,我正在冲1100
你们有什么想了解的可以发在评论区,我会仔细的看 {\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} } 你们有什么想了解的可以发在评论区,我会仔细的看
1100 粉时我会抓几个做文章 {\color{Gray} {\small1100粉时我会抓几个做文章} } 1100粉时我会抓几个做文章


今天我们学什么

今天我们不学什么,就是做一道桶排的题目

拆分

题目描述

集合的 m e x mex mex 是指一个集合中没有出现过的最小自然数。例如 m e x ( { 1 , 2 } ) = 0 , m e x ( { 0 , 1 , 2 , 3 } ) = 4 mex(\{1,2\})=0,mex(\{0,1,2,3\})=4 mex({1,2})=0,mex({0,1,2,3})=4

现在你有 n n n 个数 a 1 , . . . , a n a_1,...,a_n a1,...,an,你可以将它们划分为任意多个新集合,使得所有新集合的 m e x mex mex 之和最大,求这个最大值是多少。

输入格式

第一行输入一个正整数 n n n

接下来一行包含 n n n 个非负整数,即 a 1 , . . . , a n a_1,...,a_n a1,...,an

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

5
0 0 1 1 2

样例输出 #1

5

样例 #2

样例输入 #2

5
1 2 3 4 5

样例输出 #2

0

提示

样例1说明

分成两个集合 { 0 , 1 } , { 0 , 1 , 2 } \{0,1\},\{0,1,2\} {0,1},{0,1,2}

数据范围

对于所有测试点, 1 ≤ n ≤ 1 0 5 , 0 ≤ a i ≤ 1000 1\le n\le 10^5, 0\le a_i\le 1000 1n105,0ai1000

测试点编号 a i a_i ai 的范围
1 a i > 0 a_i>0 ai>0
2 a i = 0 a_i=0 ai=0
3-4 0 ≤ a i ≤ 1 0\le a_i\le 1 0ai1
5-10 0 ≤ a i ≤ 1000 0\le a_i\le 1000 0ai1000

题解

思路

简单的桶排题目

代码

#include<iostream>
#define f(n,i) for(i=1;i<=n;i++)
#define p std::
#define N 20000
int n,b[N+5],t,a,i,j;
int main(){
	p cin>>n;
	f(n,i)p cin>>t,b[t]++;
	f(b[0],i)
		f(N,j){
		if(!b[j]){
			a+=j;
			break;
		}b[j]--;
		}
	p cout<<a;
}

总结

做题时要仔细分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值