列表

详情


NC207473. 牛牛找子集

描述

牛牛和牛妹在玩一个游戏,在他们面前有n个数。牛妹说出一个数字k,牛牛就要从这些数中找到多个由k个数字组成的子集,每个数字有且只能使用一次,并且这些子集是完全相同的,子集内部元素可以相同,完全相同的子集是指两个集合里的元素及其个数都是相同的。
游戏胜利的目标是:找到满足游戏规则,且数量最多的子集。
牛牛特别想赢得游戏,所以他想请你帮他写一个程序,找到能够满足游戏胜利条件的子集,并且输出这个子集。如果有多个子集满足条件,输出字典序最小的即可

输入描述






示例1

输入:

12,5,[1,1,1,1,1,1,2,2,2,2,2,2]

输出:

[1,1,1,2,2]

说明:

一共有12个数字,需要找到大小为5的子集,[1,1,1,2,2]这样的子集一共有两个,满足游戏规则且字典序最小。

示例2

输入:

7,3,[1,2,3,2,4,3,1]

输出:

[1,2,3]

说明:

一共有7个数字,需要找到大小为3的子集,[1,2,3]这样的子集一共有两个,满足游戏规则且字典序最小。

原站题解

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

Python3(3.5.2) 解法, 执行用时: 777ms, 内存消耗: 15924K, 提交时间: 2020-08-14 16:19:18

#
# 返回找到能够满足游戏胜利条件的子集,如果有多个子集满足条件,返回字典序最小的即可。
# @param n int整型 代表数字的数量
# @param k int整型 代表子集的大小
# @param s int整型一维数组 代表数字数组
# @return int整型一维数组
#
class Solution:
    def solve(self , n , k , s ):
        # write code here
        from collections import Counter
        s = Counter(s)
        def judge(x):
            out = {}
            cur = 0
            for j in s:
                out[j] = s[j] // x
                cur += out[j]
            if cur < k:
                return []
            res = []
            rest = k
            for j in sorted(out):
                if out[j] >= rest:
                    res.extend([j]*rest)
                    return res
                else:
                    res.extend([j]*out[j])
                    rest -= out[j]
        for i in range(n//k, 0, -1):
            ans = judge(i)
            if ans:
                return ans

C++11(clang++ 3.9) 解法, 执行用时: 31ms, 内存消耗: 3612K, 提交时间: 2020-08-14 00:05:26

class Solution
{
	public:
		vector<int> solve(int n,int k,vector<int> &s)
		{
			vector<int> ans;
			map<int,int> cnt;
			for(auto a:s)
			{
				cnt[a]++;
			}
			auto ptr=cnt.begin();
			while(k)
			{
				for(int i=0;i<min(ptr->second,k);i++)
				ans.push_back(ptr->first);
				k-=min(ptr->second,k);
				ptr++;
			}
			return ans;
		}
};

上一题