Create The Teames(贪心)
Create The Teames
原题链接:传送门
题目大意
有一个数组具有n个数字,对这n个数进行分组,要求:每一个小组内元素个数乘以小组内元素的最小值必须要大于等于给定值 x
问最多可以分多少组(可以存在有的元素不在任意一组之内)
分析
这个问题很明显是一个贪心问题,我们可以对该数组进行从大到小排序,依次检验从该元素开始最多向右移动几次可以巨被分成一个组的条件如果具备条件则立即划分。
这题其实自己是A掉了的 但是代码写的好像有点长了,没有标程写的简单,那就贴出来学习一下标程也是对自己今后写代码的一个启示。
AC 代码
自己的代码
void slove()
{
int n , x;
cin >> n >> x;
vector<int> a(n + 1);
for(int i = 0;i < n ;i ++)cin >> a[i];
sort(a.begin(),a.end(),greater<int>());
int id = 0, size = 1 , minc = a[id] , ans = 0;
while(id < n)
{
if(a[id] >= x){
id++;ans++;
continue;
}
size = 1 , minc = a[id];
while(id < n && size * minc < x)
{
id++;size++;minc = min(minc , a[id]);
}id++;
if(size * minc >= x)ans ++;
}
cout << ans << endl;
}
标程代码
写法确实很好值得学习这样优美简单的代码
void slove()
{
int n , x;cin >> n >> x;
vector<int> a(n + 1);
for(int i = 0;i < n ;i ++)cin >> a[i];
sort(a.begin(),a.end(),greater<int>());
int size = 0 , ans = 0;
for(auto p : a)
{
size++;
if(p * size >= x)
{
size = 0;ans++;
}
}
cout << ans << endl;
}