es team 多个_Create The Teames(贪心)

Create The Teames

原题链接:传送门

题目大意

有一个数组具有n个数字,对这n个数进行分组,要求:每一个小组内元素个数乘以小组内元素的最小值必须要大于等于给定值 x

问最多可以分多少组(可以存在有的元素不在任意一组之内)

分析

这个问题很明显是一个贪心问题,我们可以对该数组进行从大到小排序,依次检验从该元素开始最多向右移动几次可以巨被分成一个组的条件如果具备条件则立即划分。

这题其实自己是A掉了的 但是代码写的好像有点长了,没有标程写的简单,那就贴出来学习一下标程也是对自己今后写代码的一个启示。

AC 代码

自己的代码

void slove()

{

int n , x;

cin >> n >> x;

vector a(n + 1);

for(int i = 0;i < n ;i ++)cin >> a[i];

sort(a.begin(),a.end(),greater());

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 a(n + 1);

for(int i = 0;i < n ;i ++)cin >> a[i];

sort(a.begin(),a.end(),greater());

int size = 0 , ans = 0;

for(auto p : a)

{

size++;

if(p * size >= x)

{

size = 0;ans++;

}

}

cout << ans << endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值