关于517编程的11月月赛—Nov.29 by Jasonxu
T1:umin之和
1.1题目
小海狸定义 umin为最小的没有在子集中出现过的非负整数。 小海狸有一组非负整数,他希望将这组数分为两个子集A和B,使得两个子集的 umin值之和最大。 请你告诉小海狸他可以得到的最大 umin之和是多少。
输入:
第一行包含一个整数n(1≤n≤1001 )-非负整数的个数。
第二行包含n个整数a1,a2,…a n(0≤a i≤1000)。
输出:出一个整数,表示 umin(A)+umin(B)的最大值。
1.2解题思路
此题还算简单,根据题意我们可以用一个桶的思想完成
1.3样例
输入:
6
0 2 1 5 0 1
输出:
5
输入:
3
0 1 2
输出:
3
输入:
6
1 2 3 4 5 6
输出:0
tips:
子任务一:30分,满足1≤n≤101;
子任务二:30分,满足1≤n≤501 ;
子任务三:40分,满足1≤n≤1001。
在第一个测试用例中,A = {0,1,2},B = {0,1,5}是一个可能的选择,umin(A)+umin(B)=3+2=5。
在第二个测试用例中,A = {0,1,2},B =∅是一个可能的选择,umin(A)+umin(B)=3+0=3。
在第三个测试用例中,A = {1,3,5},B = {2,4,6}是一个可能的选择,umin(A)+umin(B)=0+0=0。
1.4 CODE(桶思想)
#include<bits/stdc++.h>//万能头文件
using namespace std;
int cnt[110];
int main()
{
int n;
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
cin>>x;
cnt[x]++;
}
int a=0;
while(cnt[a]>=1)
{
a++;
}//前半段中的最小
int b=0;
while(cnt[b]>=2)
{
b++;
}//后半段里的最小
cout<<a+b;//相加
return