二分加贪心

版权声明:Vici__ https://blog.csdn.net/Vici__/article/details/82951744
题意:
给出n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,要求相邻的两个球:下面的球的质量大于等于其上面的那个球质量的两倍。 给出n个数(n个冰淇淋球的质量),求最多能做几个冰淇淋。

题解:
n个冰淇淋球,做一个冰淇淋需要k个冰淇淋球,则最多可做n/k个,二分可做数,然后检验(贪心)。

二分答案:left = 0,right = n / k;
贪心检验:假设能做x个,这x个冰淇淋最上面的那个球一定是前x个最小的,然后双指针逐步查找第x个冰淇淋的下一个球。(这x个球同步进行)
#include <bits/stdc++.h>
#define maxn 300010
typedef long long int ll;
using namespace std;
ll a[maxn],b[maxn];
int n,k;
bool judge(int num)
{
for(int i=0;i<num;i++)
b[i]=a[i];
int j=num;
for(int i=num;i<num*k;i++)
{
while(a[j]<b[i-num]*2&&j<n)
j++;
if(j==n) return false;
b[i]=a[j++];
}
return true;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
sort(a,a+n);
int l=0,r=n/k;
while(l<r)
{
int mid=(l+r+1)/2;
if(judge(mid))
l=mid;
else
r=mid-1;
}
printf("Case #%d: %d\n",kase,l);
}
return 0;
}
 
---------------------
作者:Lautomne_
来源:CSDN
原文:https://blog.csdn.net/vici__/article/details/82951744
版权声明:本文为博主原创文章,转载请附上博文链接!

二分就是你一开始就知道答案的范围,然后不断验证,确定其答案

原文地址:https://www.cnblogs.com/wantchange/p/11233611.html

时间: 2024-10-28 17:20:59

二分加贪心的相关文章

hdu 4004 (二分加贪心) 青蛙过河

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004 题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂直于河岸的一条直线上) 还有青蛙能够跳跃的 最多 的次数,还有每个石头离河岸的距离,问的是青蛙一步最少要跳多少米可以过河> 这是一道二分加贪心的题,从0到的河宽度开始二分,二分出一个数然后判断在这样的最小步数(一步跳多少距离)下能否过河 判断的时候要贪心 主要难在思维上,关键是要想到二分上去,能想到

Codeforces 551C - GukiZ hates Boxes(二分加贪心)

题意: 就是n个学生帮助教授搬箱子, 箱子分成m 堆, 每个学生每秒可以选择的两个操作 操作1,为从i堆迈向第i+1堆, 操作2,从i-1堆箱子中帮忙抱走一个箱子 问抱走所有箱子的最少时间为多少, 每个学生每秒可以同时行动 题解: 二分时间   然后再当前时间下,一个一个派出所有的学生,使其走到他能走的最远距离 代码: #include<stdio.h> int flag, value[100005], value2[100005], n, m; void find(long long int

Codeforces --- 982C Cut &#39;em all! DFS加贪心

题目链接: https://cn.vjudge.net/problem/1576783/origin 输入输出: ExamplesinputCopy42 44 13 1outputCopy1inputCopy31 21 3outputCopy-1inputCopy107 18 48 104 76 59 33 52 102 5outputCopy4inputCopy21 2outputCopy0NoteIn the first example you can remove the edge bet

BZOJ 2525 [Poi2011]Dynamite 二分+树形贪心

题意: n个点,一棵树,有些点是关键点,可以将m个点染色. 求所有关键点到最近的被染色点的距离的最大值最小. 解析: 反正从这道题我是学了一种做题思路? 大爷讲课的时候说的:一般选择某些点的代价相同的话都是贪心,代价不同的话一般都是DP. 想想也挺对的,不过就是没有感悟到过? 反正这题考试的时候我是直接D了贪心的- -! 忘了为啥D了. 显然最大值最小我们需要二分一下这个值. 然后接下来我们从下往上扫整棵树. 节点的状态有几个? 第一种是 子树内没有不被覆盖的关键点,并且子树中有一个节点的贡献可

HDU ACM 5248 序列变换-&gt;二分代价+贪心

分析:二分代价,由于序列是单增的,我们使前面一个数相对取最小,这样后面的数变化的值也能相对较小(贪心). #include<iostream> using namespace std; #define N 100010 #define max(a,b) ((a)>(b)?(a):(b)) int num[N],tmp[N],n; bool valid(int cost) { int i; for(i=1;i<=n;i++) tmp[i]=num[i]; tmp[1]=tmp[1]-

Gym 100886J Sockets 二分答案 + 贪心

Description standard input/outputStatements Valera has only one electrical socket in his flat. He also has m devices which require electricity to work. He's got n plug multipliers to plug the devices, the i-th plug multiplier has ai sockets. A device

POJ - 3104 Drying 二分 + 贪心

题目大意:有n件湿的衣服,每件衣服都有相应的湿度,每分钟每件衣服的湿度减1(除了在烘干机里的衣服),现在有一个烘干机,烘干机一分钟可以让一件衣服的湿度降低k,问至少要花多少分钟才能使每件衣服的湿度为0 解题思路:贪心的话,每分钟都要使用到烘干机. 枚举时间,如果湿度小于等于时间的话,就不用考虑了,在枚举时间内肯定会干的 如果湿度大于枚举时间的话,就要考虑一下了,该衣服要在给定时间内湿度变为零的话就要满足该式子,设已经过了cnt分钟了,当前这件衣服的湿度为num[i],枚举的时间为mid,那么 (

codeforces 460C - Present 二分加模拟

代码有详细解释,二分模拟寻找结果,贪心选择从哪开始浇花,原则就是遇到需要浇花的就浇,至于w可以用线段树来维护线段,但也可以用一个数组标记一下,二分总是有很多问题啊,所以写很多输出用来调试,jiong /************************************************************************* > File Name: 460c.cpp > Author: yang > Mail:[email protected] > Crea

【hoj】2160 bin packing 二分、贪心

这个题是在二分的题单上的,可是依据二分法写出来的会在oj上超时.依据题目以下给出的提示能够发现能通过贪心法每次都找最能满足的情况去填充每个包,这样就能保证使用的包的数量是最少的 二分法解法: #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> #define MAX 100000 using namespace std; int n,length; in