列表

详情


NC220736. 快乐集合

描述

czh有一个快乐集合S,集合中有n个非负数,而且这个集合还可以不断的加进非负数。
但是如果随意加的话这个集合就显得不那么快乐,于是czh就想到了一个操作:
将值为 的数加入快乐数组,其中 a 为 happy(S), b 为 max(S) ,如果在快乐数组中已经存在这个值为的数,那么这个数仍然会加入进快乐数组中。
下面对上述式子中的一些快乐的定义做出解释:
其中 表示对(a+b)/2的值向上取整,如(1+4)/2向上取整的结果为3
happy(S)表示快乐集合中最小的缺失数,如对于集合S[0,1,2,4,5] ,则happy(S) = 3
max(S)表示快乐集合中最大的数,如对于上述S,max(S) = 5
czh觉得这个集合太快乐了,于是叫来了fishfloss,想让fishfloss求一下在k次操作后,快乐集合S中不同元素的个数
fishfloss并不会,所以他很不快乐,你来帮帮他吧。

输入描述

第一行为t (1 ≤ t ≤ 100) ,代表 t 组测试用例 
每组测试用例的第一行包含两个数,其中n为集合的大小,k为操作次数
每组测试用例的第二行包含n个不同的数 为快乐集合中的数
可以保证所有测试用例的n的和不超过10

输出描述

对于每组测试用例,输出在k次操作后,快乐集合S中不同元素的个数

示例1

输入:

5
4 1
0 1 3 4
3 1
0 1 4
3 0
0 1 4
3 2
0 1 2
3 2
1 2 3

输出:

4
4
3
5
3

说明:

对于第一组测试用例,可以求得happy(S) = 2,max(S) = 4, = 3,3加入快乐集合后,集合变为[0,1,3,3,4],答案为4
对于第二组测试用例,可以求得happy(S) = 2,max(S) = 4, = 3,3加入快乐集合后,集合变为[0,1,3,4],答案为4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 471ms, 内存消耗: 96964K, 提交时间: 2021-05-25 10:53:41

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Set<Integer> set = new HashSet<Integer>();
        int t = sc.nextInt();

        while (t > 0) {
            set.clear();
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] nums = new int[100050];
            for (int i = 0; i < n; i++) {
                nums[i] = sc.nextInt();
                set.add(nums[i]);
            }

            int a = -1;
            boolean count = false;
            if (k != 0) {
                Arrays.sort(nums, 0, n );
                for (int i = 0; i < n; i++) {
                    if (nums[i] > i) {
                        a = i;
                        count = true;
                        break;
                    }
                }
                
                if(!count){
                    a = n;
                }
                
                if (a < nums[n - 1] ) {
                    int index = (int) Math.ceil((double) (a + nums[n - 1]) / 2);
                    set.add(index);
                    System.out.println(set.size());
                } else  {
                    System.out.println(set.size() + k);
                } 
            }else {
                System.out.println(set.size());
            }
            t--;
        }
    }
}

C++(clang++11) 解法, 执行用时: 60ms, 内存消耗: 3600K, 提交时间: 2021-04-23 12:46:06

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ss;
	cin>>ss;
	for(int cv=0;cv<ss;cv++)
	{
		int n,k;
		cin>>n>>k;
		vector<long long> x(n);
		set<long long> s;
		long long ma=-1;
		for(int i=0;i<n;i++)
		{
			cin>>x[i];
			s.insert(x[i]);
			ma=max(ma,x[i]);
		}
		long long now=0;
		for(;s.find(now)!=s.end();now++);
		if(now>ma||k==0)
		cout<<s.size()+k<<endl;
		else
		{
			int t=now+ma;
			if(t%2==0)
			t/=2;
			else
			t=t/2+1;
			s.insert(t);
			cout<<s.size()<<endl; 
		 } 
		 s.clear();
	}
	return 0;
}

上一题