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 ...
随机推荐
- Linux学习之编译运行.c(C语言)文件
在Linux命令行界面下,创建文件hello.c,进入vim编辑器,编辑一个简单的C语言文件 分解C语言文件执行过程,要经过预编译.编译.汇编.连接四个步骤后才能执行, 预编译:gcc -E hell ...
- python jenkins api
#!/usr/bin/pythonimport sys, timeimport shutil, commands#coding=utf-8 import sysreload(sys)sys.setde ...
- 微信小程序云开发不完全指北
微信小程序云开发不完全指北 首先必须说明云开发的"云"并不是类似云玩家里的云的意思,而是微信小程序真的提供了云开发的接口以及一个简单的提供存储.数据库服务的虚拟后台(对于一些轻量小 ...
- mysql创建存储过程动态SQL语句
DROP PROCEDURE IF EXISTS x.`wk`; DELIMITER $$ CREATE PROCEDURE `x`.`wk`() BEGIN ); ); SET t = CONCAT ...
- Tomcat通过脚本自动部署
1:autodeploy_tomcat_app.sh now=`date +%Y%m%d%H%M%S` tomcatPath=/home/test/apache-tomcat- backupPath= ...
- PHP微信发红包简明教程
PHP微信发红包简明教程1首先进入公众号申请微信支付 申请成功账号密码会发到你指定的邮箱 是登陆商户平台的2 进入后申请发红包借口3 调用发红包接口 https://api.mch.weixin.qq ...
- 超级简单POI多sheet导出Excel实战
本章节主要基于上一章节单sheet导出的基础上进行改造实现多sheet的导出,上一章节参考地址:https://www.cnblogs.com/sunny1009/p/11437005.html 1. ...
- SpringBoot:3.SpringBoot使用Spring-data-jpa实现数据库访问
做Web开发,首先要能将数据渲染到网页中展示,其次是要获取数据库数据展示到视图层,在前面的文章SpringBoot整合Thymeleaf模板引擎渲染web视图,我们实现了从后端数据展示到视图层,那么下 ...
- tomcat宕机自动重启脚本
#!/bin/bash# 获取tomcat进程ID /usr/share/tomcatTomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat'|grep -v ...
- docker封装mysql镜像
一.概述 直接使用官方的镜像 docker pull mysql:5.7 但是mysqld.cnf并没有优化,还是默认的. 二.封装镜像 创建目录 # dockerfile目录 mkdir -p /o ...