博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3486 Interviewe【二分+rmq】
阅读量:6759 次
发布时间:2019-06-26

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

题意: 给出 n 个序列,要求把它分成长度相等的m份,多余的去掉,要求每份的最大值之和大于 k。

         问最少要分成多少份。

分析: 二分区间,用rmq预处理出区间最大值。

#include 
#include
#include
#define max(a,b)(a)>(b)?(a):(b)#define maxn 200005int val[maxn];int dp[maxn<<1][20];int k,n;void makermq(){ int i, j; for(i = 1; i <= n; i++) dp[i][0] = val[i]; for(j = 1; (1<
<=n; j++) for(i = 1;i+(1<
<=n; i++) dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}int rmq(int l,int r){ int k = (int)(log((r-l+1)*1.0)/log(2.0)); return max(dp[l][k],dp[r-(1<
k) return 1; } return sum>k;}inline bool scan_d(int &num) { char in; bool IsN=false; in=getchar(); if(in==EOF) return false; while(in!='-'&&(in<'0'||in>'9')) in=getchar(); if(in=='-'){ IsN=true;num=0;} else num=in-'0'; while(in=getchar(),in>='0'&&in<='9'){ num*=10,num+=in-'0'; } if(IsN) num=-num; return true;}int main(){ int i; int l, r, mid, res; while(scanf("%d %d",&n, &k)!=EOF) { if(n<0&&k<0) break; for(i = 1; i <= n; i++) scan_d(val[i]); makermq(); l = 1; r = n; res = -1; while(l<=r) { mid = (l+r)>>1; if(ok(mid)){ res = mid; r = mid-1; } else l = mid+1; } printf("%d\n",res); } return 0;}

 

转载于:https://www.cnblogs.com/dream-wind/archive/2012/10/25/2738081.html

你可能感兴趣的文章
UVA 247 - Calling Circles (Floyd)
查看>>
Exchange: How to get Mailbox size in Exchange Shell?
查看>>
SqlBulkCopy使用心得
查看>>
几点要求自己也可以借鉴
查看>>
Highcharts的一些属性
查看>>
xadmin 组件拓展自定义使用
查看>>
5.14 数据库函数,流程控制
查看>>
Django 中间件
查看>>
学城项目知识点整理及源码
查看>>
sqlServer,oracle中case关键字的用法
查看>>
表驱动法之保险费率
查看>>
苹果硅胶套市场空间上百亿:合作厂商利润达30%
查看>>
娇俏2011年春装
查看>>
备份还原oracle数据库
查看>>
[转载] AUML——FIPA Modeling Technical Committee
查看>>
Samba Server Configuration - Simple
查看>>
【ZZ】大型数据库应用解决方案总结 | 菜鸟教程
查看>>
Apr. 2th
查看>>
电脑—切难题实用篇
查看>>
栅格那点儿事(四D)
查看>>