题目链接:

http://codeforces.com/gym/101194/attachments

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5922

题意:

给出 $N$ 个冰淇淋球,第 $i$ 个冰淇淋球大小为 $B_i$,现在已知冰淇淋球堆叠起来可组成一个冰淇淋。

对于上下相邻的两个冰淇淋球,只有上面的那个大小不超过下面的那个的一般,才能堆叠起来。

现在已知 $K$ 个冰淇淋球可以组成一个冰淇淋,问给出的 $N$ 个冰淇淋球最多能组成多少个冰淇淋。

假的题解:

比赛的时候想的一个(假的)贪心思路:

  从最大的冰淇淋球开始贪心,对于目前这个球,始终选择小于等于当前球体积的一半中体积最大的冰淇淋球。

进而可得这样一个用队列维护 $O(N)$ 的做法:

  从大到小枚举冰淇淋球,用一个队列维护:目前产生的冰淇淋的最上端的那个冰淇淋球,以及该冰淇淋包含的冰淇淋球数目。

  枚举到当前这个球 $B_i$,与队首冰淇淋进行比较,若可以放到这个冰淇淋上,就放上去产生一个新的冰淇淋,出队队首元素,入队一个新冰淇淋;否则就作为一个新的冰淇淋入队。

代码(AC on UVALive 7900, WA on Gym 101194D):

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int maxn=3e5+; int n,k;
ll b[maxn];
queue<pli> Q; int main()
{
int T;
cin>>T;
for(int kase=;kase<=T;kase++)
{
cin>>n>>k;
for(int i=;i<=n;i++) scanf("%lld",&b[i]);
sort(b+,b+n+);
int ans=;
while(!Q.empty()) Q.pop();
for(int i=n;i>=;i--)
{
if(Q.empty())
{
Q.push(make_pair(b[i],));
continue;
}
pli now=Q.front();
if(b[i]<=(now.first>>))
{
Q.pop();
if(now.second+>=k) ans++;
else Q.push(make_pair(b[i],now.second+));
}
else Q.push(make_pair(b[i],));
}
printf("Case #%d: %d\n",kase,ans);
}
}

真的题解:

若要求做 $cnt$ 个冰淇淋,那么肯定先取最小的 $cnt$ 个冰淇淋球作为顶,然后一点点往前后推判断是否真的能做出 $cnt$ 个球。

那么,就可以二分答案,最少 $0$ 个冰淇淋,最多 $\left \lfloor \frac{N}{K} \right \rfloor$ 个冰淇淋。

时间复杂度 $O(N \log \left \lfloor \frac{N}{K} \right \rfloor)$

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int maxn=3e5+; int n,k;
ll b[maxn];
queue<pli> Q;
inline bool judge(int cnt)
{
for(int i=;i<=cnt;i++) Q.push(make_pair(b[i],));
for(int i=cnt+;i<=n;i++)
{
pli now=Q.front();
if(b[i]>=(now.first<<))
{
Q.pop();
Q.push(make_pair(b[i],now.second+));
}
}
int res=;
while(!Q.empty())
{
res+=(Q.front().second>=k);
Q.pop();
}
return res>=cnt;
} int main()
{
int T;
cin>>T;
for(int kase=;kase<=T;kase++)
{
cin>>n>>k;
for(int i=;i<=n;i++) scanf("%lld",&b[i]);
sort(b+,b+n+);
int l=, r=n/k;
while(l<r)
{
int mid=(l+r+)>>;
if(judge(mid)) l=mid;
else r=mid-;
}
printf("Case #%d: %d\n",kase,l);
}
}

Gym 101194D / UVALive 7900 - Ice Cream Tower - [二分+贪心][2016 EC-Final Problem D]的更多相关文章

  1. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  2. Gym 101194E / UVALive 7901 - Ice Cream Tower - [数学+long double][2016 EC-Final Problem E]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  3. The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心

    题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...

  4. Ice Cream Tower(The 2016 ACM-ICPC Asia China-Final Contest 二分&贪心)

    题目: Mr. Panda likes ice cream very much especially the ice cream tower. An ice cream tower consists ...

  5. Ice Cream Tower

    2017-08-18 21:53:38 writer:pprp 题意如下: Problem D. Ice Cream Tower Input file: Standard Input Output f ...

  6. Gym 101194D Ice Cream Tower

    被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...

  7. Ice Cream Tower Gym - 101194D (贪心 + 二分 )

    题目链接 : https://cn.vjudge.net/problem/Gym-101194D 题目大意 : 给你n个冰激凌球,让你用这些冰激凌球去垒冰激凌,要求是下面的这一个必须是他上面一个的两倍 ...

  8. Problem D. Ice Cream Tower

    题解:二分加贪心,,,二分答案,然后进行判断,判断的时候,首先给每一组配一个最大的球,然后在向每一组里面填球,注意填球的时候要按组进行,每一组先填一个,然后更新每一组内的最小值,方便下一次寻找. #i ...

  9. Gym 101194C / UVALive 7899 - Mr. Panda and Strips - [set][2016 EC-Final Problem C]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

随机推荐

  1. CentOS7配置防火墙

    使用命令的方式配置 ##Add firewall-cmd --permanent --zone=public --add-port=/tcp ##Remove firewall-cmd --perma ...

  2. go微服务框架go-micro深度学习(四) rpc方法调用过程详解

    上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地 ...

  3. markdown列表中的缩进

    使用markdown时,一向不敢使用多级列表,因为多级列表容易出错.而实际上,只需要缩进两个空格就可以实现嵌套了. * one 这个是one的内容 * two 这个是two的内容 * three * ...

  4. golang编译库文件方式

    // as c-shared library $ go build -buildmode=c-shared -o nautilus.a nautilus.go // as c-archive $ go ...

  5. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  6. 伟哥对RTO & RPO的通俗理解

    RTO (Recovery Time Objective,复原时间目标)是企业可容许服务中断的时间长度.比如说灾难发生后半天内便需要恢复,RTO值就是十二小时: RPO (Recovery Point ...

  7. 【谷歌浏览器】【谷歌地球】【Adobe 软件】离线安装包的下载地址

    因为某些原因?我们需要下载谷歌浏览器的离线安装版,找了好几次地址了,这次自己记录一下吧! 主要就是加两个参数,standalone 就是离线安装吧,platform 就是平台版本吧,哈~ 离线32位: ...

  8. zc702-自定义AXI-IP核实验

    目的: 自定义一个IP核,通过AXI总线与ARM系统连接 环境: Win7 32bit Vivado2014.4.1 Xilinx sdk2014.4 开发板: Zc702 第一步: 新建一个自定义的 ...

  9. Machine Learning第十一周笔记:photo OCR

    博客已经迁移至Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完毕了Cousera上Machine Learning的最后一周课程.这周介绍了 ...

  10. Windows7系统不显示.gitignore文件名

    从码云拉取项目后,发现Win7下不能显示.giignore文件名. 这是因为Win7系统默认隐藏了已知的拓展名,而.gitignore逗号前没有字符,于是显示的文件命是空白的. 打开工具—文件夹选项, ...