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 ...
随机推荐
- EF Migrations error: No connection string named 'MpDb' could be found in the application config file.
solution: update-database 命令查找连接字符是在当前启动项目中找的 确保启动项目中connectiongString配置存在.
- mysql5.6 sql_mode设置为宽松模式
最近遇到一个很奇怪的事情 由于数据人员的需求,现在需要修改mysql的sql_mode sql_mode默认是sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_ ...
- system generator学习笔记【01】
作者:桂. 时间:2018-05-18 18:26:50 链接:http://www.cnblogs.com/xingshansi/p/9045914.html 前言 学习使用system gene ...
- python 模块学习
一.from django.contrib.auth.hashers import make_password 通过函数名即可发现,主要有两个函数,分别是创建密码和验证 用法 ps = " ...
- amqp笔记
1.exchange message的生产者可以将消息发送给exchange,然后由exchange路由到不同的queue中. exchange有4种类型: direct exchange:msg只会 ...
- cmder里ls、pwd、自定义的alias等一系列命令都无法使用
win10下cmder很多命令history pwd无法使用,ls字体也没有颜色显示,其根本原因是win10下cmd控制台版本问题,切换回老版本就OK了
- delphi怎样把子窗体显示在pagecontrol的tabsheet
https://bbs.csdn.net/topics/391980918 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, Sy ...
- [Linux]systemd和sysV
转自:https://www.cnblogs.com/EasonJim/p/7168216.html 在Debian8中systemd和sysVinit同时存在,NTP就是在/etc/init.d/n ...
- linux服务查看
(1)#service servicename status比如查看防火墙:#service iptables status (2)#chkconfig --list |grep 服务名 比如查看te ...
- find ctime 加减n时间范围
看下atime的时间解释:-atime n File was last accessed n*24 hours ago. When find figures out how many 24-hour ...