The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心
题目大意:
对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔
题目分析:
对于n个冰激凌球,显然我们得知可以堆出的高度为k的塔的数量在0~[n / k]之间,这里可以通过二分遍历每一种可能,初始时二分边界l==0,r==[n / k],每次取中间值mid=(l+r)/ 2,判断mid高度为k的塔能否堆出,如果可以则尝试mid为更大,否则则尝试mid为更小时,不断二分尝试mid是否可行,而对于每个mid,我们要写一个判断函数,来判断mid座高度为k的冰激凌塔能否堆出,这里用到了贪心的思维,我们先对n个冰激凌球的大小进行从小到大的排序,然后对于mid座塔我们只要创建一个一维数组,0~mid-1放置排完序的冰激凌球的前mid个(由于已经将冰激凌球排序,取出前mid个放入这个数组即可),然后循环k-1遍(因为高度初始已经为1,只要再判断k-1层的情况即可),从编号为mid开始依次选取冰激凌球(从小到大)与这个0~mid-1个位置进行比较,如果满足是它的至少两倍则更新0~mid-1位置的冰激凌球大小,否则继续往后找一个满足的冰激凌球去替换它,完成了一层之后则继续从0~mid-1开始(共k层),假如中途出现冰激凌球已经遍历到最后,但是还是k层冰激凌塔没有完成堆叠,则返回失败,否则在结束所有k层的每个判断后返回成功
关于贪心的部分,由于数组是从小到大排序的,如果遇到一个位置不满足是它的至少两倍则将下标往后移动,前面的就被舍弃了(因为对后面的位置来说,它一定是比前面位置大的,指向该下标的冰激凌球大小如果不满足前者至少两倍,则不可能满足后者的至少两倍关系,而从小到大排序选择也是满足了最优的选择方案,先用小的试探,后用大的试探,小的一定在前面)
代码:
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- const int M = ;
- long long ice[M];
- long long update[M];
- int n, k;
- bool judge(int x){ //x代表判断做x个塔是否可行
- for(int i = ; i < x; i++){
- update[i] = ice[i];
- }
- int cnt = x;
- for(int i = ; i < k; i++){
- for(int j = ; j < x; j++){
- while(update[j]* > ice[cnt] && cnt < n) cnt++;
- if(cnt == n) return false;
- update[j] = ice[cnt];
- cnt++;
- }
- }
- return true;
- }
- int main(){
- int t;
- scanf("%d", &t);
- int cnt = ;
- while(t--){
- scanf("%d%d", &n, &k);
- for(int i = ; i < n; i++) scanf("%lld", &ice[i]);
- sort(ice, ice + n);
- int l = ;
- int r = n/k;
- int ans = ;
- while(l <= r){
- int m = (l+r)/;
- if(judge(m)){
- l = m+;
- ans = m;
- }else{
- r = m-;
- }
- }
- printf("Case #%d: %d\n", cnt++, ans);
- }
- return ;
- }
The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心的更多相关文章
- 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 ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元
hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp
odd-even number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
随机推荐
- 基于AOP的插件化(扩展)方案
在项目迭代开发中经常会遇到对已有功能的改造需求,尽管我们可能已经预留了扩展点,并且尝试通过接口或扩展类完成此类任务.可是,仍然有很多难以预料的场景无法通过上述方式解决.修改原有代码当然能够做到,但是这 ...
- orcle not like不建议使用(not like所踩过的坑!)
1.情景展示 现在有一张表,需要将表中某字段的值不是以指定字符开头的列进行删除,如何实现? 2.问题分析 错误方案一:同事想到的是:这种方式 咱们来看一下,这个表总共有多少条数据 本来表数据总共才 ...
- WebGPU学习(七):学习“twoCubes”和“instancedCube”示例
大家好,本文学习Chrome->webgpu-samplers->twoCubes和instancedCube示例. 这两个示例都与"rotatingCube"示例差不 ...
- c# 大白话告诉你Thread的Sleep和Join的区别
我们的程序默认会有两个线程,一个是主线程,一个是负责垃圾回收的线程.如果代码不使用多线程,就只有主线程这一条干道.1.在主线程中调用Thread.Sleep(1000),表示主线程阻塞自己1秒.2.在 ...
- Python 2 代码转 Python 3的一些转化
Python 2 代码转 Python 3的一些转化 1.“print X” 更改为“print(X)” 2.xrange改为range 3.m.itervalues() 改为 m.values() ...
- Maven使用tomcat7-maven-plugin
原文地址:https://www.cnblogs.com/mozisss/p/10233366.html 功能: (使用maven中的tomcat插件,就可以将tomcat集成到项目中,效果就是:在不 ...
- 蚂蚁花呗5面面试真题,你敢来挑战一下吗?(Java岗)
蚂蚁花呗一面(一个小时): JDK 中有哪几个线程池?顺带把线程池讲了个遍 Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? j ...
- JDBC链接数据库MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法
现象 Mybatis和Spring框架整合过程中报 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Publ ...
- golang ---Learn Concurrency
https://github.com/golang/go/wiki/LearnConcurrency 实例1: package main import ( "fmt" " ...
- 【1】【leetcode-139】【回溯超时、动态规划】单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词.你可以假设字典中没有重复的 ...