题目 题意:给定一个长度为 n n n的数组,将这数组的元素分配到k个集合 s t i st_i sti里边,要求每个元素都分配到其中一个集合,且每个集合不能为空。问怎么分配,才能使最终所有集合的大小和,最小。即求 m i n ( s u m i = 1 k ( s t i . s i z e ( ) ) ) min(sum_{i=1}^k(st_i.size())) min(sumi=1k(sti.size()))。其中k取1到n。
思路:贪心,将相同元素分配到同个集合,使相同的元素,贡献为1。 令 n u m num num表示数组中不同元素的个数,对于 k < = n u m knum k>num的情况,由于此时集合数量超过了不同元素个数,我们只能将相同元素,拆分到新的集合中。此时答案为 k k k。
#include
using namespace std;
#define ll long long
const int maxn = 300010;
int n, a[maxn], x;
set st;
// 排序和set都能过,unordered_set T了,有点神奇
//unordered_set st;
void solve() {
scanf("%d", &n);
st.clear();
int num = 0;
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?