Gym 101194D / UVALive 7900 - Ice Cream Tower - [二分+贪心][2016 EC-Final Problem D]
题目链接:
http://codeforces.com/gym/101194/attachments
题意:
给出 $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]的更多相关文章
- 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心
/** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...
- 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 ...
- The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心
题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...
- 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 ...
- Ice Cream Tower
2017-08-18 21:53:38 writer:pprp 题意如下: Problem D. Ice Cream Tower Input file: Standard Input Output f ...
- Gym 101194D Ice Cream Tower
被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...
- Ice Cream Tower Gym - 101194D (贪心 + 二分 )
题目链接 : https://cn.vjudge.net/problem/Gym-101194D 题目大意 : 给你n个冰激凌球,让你用这些冰激凌球去垒冰激凌,要求是下面的这一个必须是他上面一个的两倍 ...
- Problem D. Ice Cream Tower
题解:二分加贪心,,,二分答案,然后进行判断,判断的时候,首先给每一组配一个最大的球,然后在向每一组里面填球,注意填球的时候要按组进行,每一组先填一个,然后更新每一组内的最小值,方便下一次寻找. #i ...
- 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 ...
随机推荐
- 删除 nuget 文件夹内容
vs2017 ->工具->选项->NuGet 包管理器->清除所有NuGet缓存
- Atitit 最近资料文章列表r9 r8 月份 attilax总结
Atitit 最近资料文章列表r9 r8 月份 attilax总结 atitit tag标签标示规范 attilax总结 v2 r922.docx 2017-09-28 02:04 阅读(27) ...
- Fluent动网格【12】:扩散光顺
扩散光顺是Fluent提供的另外一种常用的网格光顺方法.其基本原理是通过求解扩散方程得到网格节点的运动位移. 扩散光顺基本计算 扩散光顺通过求解 以下扩散方程来设置网格的节点位置. \[ \nabla ...
- 【转载】Hadoop 2.7.3 和Hbase 1.2.4安装教程
转载地址:http://blog.csdn.net/napoay/article/details/54136398 目录(?)[+] 一.机器环境 系统:MAC OS Hadoop:2.7.3 H ...
- SQL Server 2016新特性:Query Store
使用Query Store监控性能 SQL Server Query Store特性可以让你看到查询计划选择和性能.简化了性能调优,可以快速的发现因为查询计划的选择导致的性能的差别.Query Sto ...
- spring boot与kafka
1.项目搭建 2.关键代码与配置 3.性能调优 注意,本项目基于spring boot 1,如果是spring boot 2有可能会报错.相应的包需要更新 1.项目搭建 kafka版本:kafka_2 ...
- Visual studio中编译和使用libpng和zlib
Visual studio中编译和使用libpng和zlib https://blog.csdn.net/jinzhuojun/article/details/7972747
- WPS Office手机版调用接口代码指导帖之二 [复制链接]
原文链接:http://bbs.wps.cn/thread-22349340-1-1.html 从V5.1版本开始,WPS移动版本提供了额外的功能,可以供第三方程序通过集成的方式调用“WPS移动版”打 ...
- 利用opencv进行移动物体检测
进行运动物体检测就是将动态的前景从静态的背景中分离出来.将当前画面与假设是静态背景进行比较发现有明显的变化的区域,就可以认为该区域出现移动的物体.在实际情况中由于光照阴影等因素干扰比较大,通过像素直接 ...
- bootstrap滚动监视原理实现
最近在公司实习,刚好写了一个静态的网页,用到了滚动监视,就自己写了个监视,话不多说直接进入正题 $(function () { var $root = $("html,body") ...