题目大意:

对于给出的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层的每个判断后返回成功

关于贪心的部分,由于数组是从小到大排序的,如果遇到一个位置不满足是它的至少两倍则将下标往后移动,前面的就被舍弃了(因为对后面的位置来说,它一定是比前面位置大的,指向该下标的冰激凌球大小如果不满足前者至少两倍,则不可能满足后者的至少两倍关系,而从小到大排序选择也是满足了最优的选择方案,先用小的试探,后用大的试探,小的一定在前面)

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5.  
  6. const int M = ;
  7. long long ice[M];
  8. long long update[M];
  9. int n, k;
  10.  
  11. bool judge(int x){ //x代表判断做x个塔是否可行
  12. for(int i = ; i < x; i++){
  13. update[i] = ice[i];
  14. }
  15. int cnt = x;
  16. for(int i = ; i < k; i++){
  17. for(int j = ; j < x; j++){
  18. while(update[j]* > ice[cnt] && cnt < n) cnt++;
  19. if(cnt == n) return false;
  20. update[j] = ice[cnt];
  21. cnt++;
  22. }
  23. }
  24. return true;
  25. }
  26.  
  27. int main(){
  28. int t;
  29. scanf("%d", &t);
  30. int cnt = ;
  31. while(t--){
  32. scanf("%d%d", &n, &k);
  33. for(int i = ; i < n; i++) scanf("%lld", &ice[i]);
  34. sort(ice, ice + n);
  35. int l = ;
  36. int r = n/k;
  37. int ans = ;
  38. while(l <= r){
  39. int m = (l+r)/;
  40. if(judge(m)){
  41. l = m+;
  42. ans = m;
  43. }else{
  44. r = m-;
  45. }
  46. }
  47. printf("Case #%d: %d\n", cnt++, ans);
  48. }
  49. return ;
  50. }

The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心的更多相关文章

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

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

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

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

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

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

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

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

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

随机推荐

  1. 基于AOP的插件化(扩展)方案

    在项目迭代开发中经常会遇到对已有功能的改造需求,尽管我们可能已经预留了扩展点,并且尝试通过接口或扩展类完成此类任务.可是,仍然有很多难以预料的场景无法通过上述方式解决.修改原有代码当然能够做到,但是这 ...

  2. orcle not like不建议使用(not like所踩过的坑!)

      1.情景展示 现在有一张表,需要将表中某字段的值不是以指定字符开头的列进行删除,如何实现? 2.问题分析 错误方案一:同事想到的是:这种方式 咱们来看一下,这个表总共有多少条数据 本来表数据总共才 ...

  3. WebGPU学习(七):学习“twoCubes”和“instancedCube”示例

    大家好,本文学习Chrome->webgpu-samplers->twoCubes和instancedCube示例. 这两个示例都与"rotatingCube"示例差不 ...

  4. c# 大白话告诉你Thread的Sleep和Join的区别

    我们的程序默认会有两个线程,一个是主线程,一个是负责垃圾回收的线程.如果代码不使用多线程,就只有主线程这一条干道.1.在主线程中调用Thread.Sleep(1000),表示主线程阻塞自己1秒.2.在 ...

  5. Python 2 代码转 Python 3的一些转化

    Python 2 代码转 Python 3的一些转化 1.“print X” 更改为“print(X)” 2.xrange改为range 3.m.itervalues() 改为 m.values() ...

  6. Maven使用tomcat7-maven-plugin

    原文地址:https://www.cnblogs.com/mozisss/p/10233366.html 功能: (使用maven中的tomcat插件,就可以将tomcat集成到项目中,效果就是:在不 ...

  7. 蚂蚁花呗5面面试真题,你敢来挑战一下吗?(Java岗)

    蚂蚁花呗一面(一个小时): JDK 中有哪几个线程池?顺带把线程池讲了个遍 Java容器有哪些?哪些是同步容器,哪些是并发容器? ArrayList和LinkedList的插入和访问的时间复杂度? j ...

  8. JDBC链接数据库MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法

    现象 Mybatis和Spring框架整合过程中报 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Publ ...

  9. golang ---Learn Concurrency

    https://github.com/golang/go/wiki/LearnConcurrency 实例1: package main import ( "fmt" " ...

  10. 【1】【leetcode-139】【回溯超时、动态规划】单词拆分

    给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词.你可以假设字典中没有重复的 ...