2017-08-18 21:53:38

writer:pprp

题意如下:

Problem D. Ice Cream Tower
Input file: Standard Input
Output file: Standard Ouptut
Time limit: seconds
Mr. Panda likes ice cream very much especially the ice cream tower. An ice cream tower consists
of K ice cream balls stacking up as a tower. In order to make the tower stable, the lower ice cream
ball should be at least twice as large as the ball right above it. In other words, if the sizes of the
ice cream balls from top to bottom are A0, A1, A2, · · · , AK−, then A0 × ≤ A1, A1 × ≤ A2,
etc.
One day Mr. Panda was walking along the street and found a shop selling ice cream balls. There
are N ice cream balls on sell and the sizes are B0, B1, B2, · · · , BN−. Mr. Panda was wondering
the maximal number of ice cream towers could be made by these balls.
Input
The first line of the input gives the number of test cases, T. T test cases follow. Each test
case starts with a line consisting of integers, N the number of ice cream balls in shop and K
the number of balls needed to form an ice cream tower. The next line consists of N integers
representing the size of ice cream balls in shop.
Output
For each test case, output one line containing “Case #x: y”, where x is the test case number
(starting from ) and y is the maximal number of ice cream towers could be made.
Limits
• 1 ≤ T ≤ 100.
• 1 ≤ N ≤ 3 × 105
.
• 1 ≤ K ≤ 64.
• 1 ≤ Bi ≤ 1018
.
Sample input and output
Sample Input Sample Output
3
4 2
1 2 3 4
6 3
1 1 2 2 4 4
6 3
1 1 2 2 3 4
Case #1: 2
Case #2: 2
Case #3: 1
Page 5 of 21

题意:给你一个n代表有多少重量的冰激凌块,再给你要求的冰激凌塔的层数,冰激凌塔的规则是下一个必须等于或者大于上一层的二倍

然后给你n个重量,问你最多可以完成需要的多少个冰激凌塔

答案有二分性质,所以先进行二分,然后判断该答案是否符合要求,这部分用贪心的思想验证

其中验证答案是否符合要求这部分不是很好实现,借鉴大佬的代码,研究了半天,一步一步手动推到,

发现用的是双指针写的,的确可以使代码变得很简练

/*
prob: Ice Cream Tower
writer:pprp
date:2017/8/18
declare:二分+贪心
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
int N, K;
const int maxn = ;
typedef long long ll;
ll a[maxn], b[maxn];
int tmp; int judge(int m) //检验m个冰淇淋能否做出来
{
for(int i = ; i < m; i++)//仅仅初始化前m个
b[i] = a[i]; //双指针移动
int p = m; //p指针指向数组a for(int i = m; i < m * K; i++) //i 指针指向 数组b
{
while(a[p] < b[i - m] * && p < N) //通过移动指针p,找到恰好大于二倍的点
p++; if(p == N) //边界条件,如果指针p移动到数组a的末尾,那么证明没有找到相应的值,则出错
return ; b[i] = a[p]; //将数组a中满足的点都加入到数组b中 p++; //指针p进行下一步移动
} return ;
} int bisearch(int l, int r)
{
while(l < r)
{
int mid = (l + r + ) >> ;//如果是 l + r就会变成死循环
if(judge(mid))//如果成功
{
l = mid;
}
else
{
r = mid - ;
}
}
return l;
} int main()
{
int T;
cin >> T; for(int j = ; j <= T ; j++)
{
cin >> N >> K;
memset(a,,sizeof(a)); for(int i = ; i < N ; i++)
cin >> a[i]; sort(a, a + N); cout <<"Case #" << j << ": "<< bisearch(, N/K) << endl;
}
return ;
}

Ice Cream Tower的更多相关文章

  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. 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 ...

  3. Gym 101194D Ice Cream Tower

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

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

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

  5. Gym 101194D / UVALive 7900 - Ice Cream Tower - [二分+贪心][2016 EC-Final Problem D]

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

  6. 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 ...

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

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

  8. Problem D. Ice Cream Tower

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

  9. HackerRank Ice Cream Parlor

    传送门 Ice Cream Parlor Authored by dheeraj on Mar 21 2013 Problem Statement Sunny and Johnny together ...

随机推荐

  1. Android项目使用Eclipse进行单元测试

    Android项目如果每次都整个调试的话,要加载UI,会等很长时间.所以单元测试就显得很方便了. 要进行单元测试,首先得修改下AndroidManifest.xml文件.在Instrument标签里点 ...

  2. 【opencv入门篇】 10个程序快速上手opencv【下】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) 上篇传送:http: ...

  3. android推送,极光推送

    android中简单易用的消息推送方式之中的一个 -------> 极光推送 首先来介绍一下极光推送. 极光推送:英文简称 JPush,是一个面向普通开发人员免费.开放的第三方消息推送服务,我们 ...

  4. 0602-Zuul构建API Gateway-Zuul Http Client、cookie、header

    一.Zuul Http Client zuul使用的默认HTTP客户端现在由Apache HTTP Client支持,而不是已弃用的Ribbon RestClient.要使用RestClient或使用 ...

  5. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  6. Ubuntu解压命令全览

    1. Ubuntu解压命令全览.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName 注:tar是打包,不是压缩! .gz 解压1:g ...

  7. Python 集合(set)的使用总结

    集合的特点:去重.无序,因此无法通过下标取值. 1. 定义集合 s = set() #定义空的集合 s2 = {'} # 不是key -value形式的话就是集合,不是字典 s3 ={'} print ...

  8. JUnit之参数化测试、套件/成组测试的使用

    原文地址http://blog.csdn.net/yqj2065/article/details/39967065 参数化测试 正如数组替代int a0,a1,a2一样,测试加法时assertEqua ...

  9. JS答辩习题

    php高中班javascript答辩题目 1 什么是javascript?  答:Javascript是一种专门设计用来增强网页交互性的脚本语言,它也是一种解释型语言. 2 Javascript与C语 ...

  10. HDU2189 来生一起走

    好久没发博客了,最近遇到以下奇葩错误,不明觉厉,忍不住发一篇 /*母函数,因为要求的是素数,那么先打一个素数表,所有的因子都是素数构成 但是遇到一个奇葩事,当num初值取1,结果就出不来,运行了好久 ...