博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ECfinal-D-Ice Cream Tower-二分+贪心
阅读量:5046 次
发布时间:2019-06-12

本文共 1399 字,大约阅读时间需要 4 分钟。

https://vjudge.net/problem/Gym-101194D

题意:在一堆数中,找到对多的组合,使得每个组合的个数为K,且满足在排序后,后一个是前一个的两倍;

思路:二分,贪心;自己想不到贪心check是真的忧伤。这里,只要再开一个pre数组记录每组最新的数字,然后一个个(这组找到了一个,调到下一组找一个)去找是否存在满足条件的后一个数字。

代码:

#include 
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn = 3e5+8;int k,n;ll a[maxn];ll pre[maxn];bool check(int x){ for(int i=1; i<=x; i++) pre[i] = a[i]; int id = x + 1; for(int g = 1; g<=k - 1; g++) { for(int i=1; i<=x; i++) { if(id>n)return false; while(a[id] < 2 * pre[i]) { id++; if(id>n)return false; } pre[i] = a[id]; id++; } } return true;}int main(){ int T; scanf("%d", &T); for(int t=1; t<=T; t++) { scanf("%d%d", &n, &k); for(int i = 1; i<=n;i++) { scanf("%lld" ,&a[i]); } sort(a+1, a+n+1); int le = 0,ri = n / k +1; while(le + 1 < ri) { int mid = le + (ri - le)/2; if(check(mid)) { le = mid; } else ri = mid; } if(k==1)le = n; printf("Case #%d: %d\n",t,le); } return 0;}

 

转载于:https://www.cnblogs.com/ckxkexing/p/8955161.html

你可能感兴趣的文章
C#线程入门
查看>>
CSS清除浮动方法
查看>>
JVM内存回收机制简述
查看>>
洛咕 P2480 [SDOI2010]古代猪文
查看>>
js-创建对象的几种方式
查看>>
JDK JRE Java虚拟机的关系
查看>>
2018.11.20
查看>>
word20161215
查看>>
12th week blog
查看>>
dijkstra (模板)
查看>>
python小记(3)
查看>>
编译Linux驱动程序 遇到的问题
查看>>
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
android圆角View实现及不同版本号这间的兼容
查看>>
OA项目设计的能力③
查看>>
Cocos2d-x3.0 文件处理
查看>>