51nod 1105 二分套二分
来源:互联网 发布:网络棋牌作弊器 编辑:程序博客网 时间:2024/05/21 11:00
题意:
中文题
题解:
思路:二分套二分
步骤:
1···对两个数组进行排序
2···找到二分答案所需的上下界进行二分(mid)
3···然后枚举一个数组下标,对另外一个数组下标进行二分
4···第三步用函数计算比mid大的数有多少个
这样二分下来即可以得到所需要第K大的数
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,k;#define LL long long#define MAXN 50005LL a[MAXN],b[MAXN];int cmp(const void *x,const void *y){ return *(LL *)y - *(LL *)x;}LL deal(LL num){ LL cnt=0; for(int i=0;i<n;i++){ LL left=0,right=n-1; LL t=0; while(left<=right) { LL mid=(left+right)>>1; if(a[i]*b[mid]>=num) t=mid+1,left=mid+1; else right=mid-1; } cnt+=t; } return cnt;}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<n;i++) scanf("%lld%lld",&a[i],&b[i]); qsort(a,n,sizeof(a[0]),cmp); qsort(b,n,sizeof(b[0]),cmp); LL ans=0; LL right=a[0]*b[0]; LL left=a[n-1]*b[n-1]; while(left<=right) { LL mid=(left+right)>>1; if(deal(mid)>=k) ans=mid,left=mid+1; else right=mid-1; } printf("%lld\n",ans); } return 0;}
0 0
- 51nod 1105---二分套二分
- 51nod 1105 二分套二分
- 51 nod 1105 第K大的数 二分套二分
- 51nod 1105 第K大的数 (二分套二分 好题)
- POJ3685->二分套二分
- 二分套二分
- 51nod 1267【二分】
- 51Nod - 1065 二分
- poj 3685 二分套二分
- poj 3685 二分套二分
- 51nod 1272【二分+RMQ】
- 51Nod - 1521 STL +二分
- 51nod 1287 加农炮【二分】
- 51Nod-1799-二分答案
- 51nod 1799 二分答案
- 51nod 1799 二分答案
- 51nod 1799 二分答案
- 51nod 1799 二分答案
- HDOJ 2818 Building Block (带权并查集)
- web前端学习随笔
- ArrayLIst源码探究
- excel突出显示两列的不同数据
- 使用telnet验证服务器端口是否开启
- 51nod 1105 二分套二分
- hdu2586 How far away ? 【图论-Tarjan-Lca】
- Hadoop生态系统搭建(3)——数据仓库 Hive 的安装部署与测试
- lintcode 将二叉树拆成链表
- 动态库与静态库
- 转载(原标题:网站再遭新威胁 Struts2又曝高危漏洞啦)
- quartz和timer的区别
- JavaFX的WebView中通过JavaScript回调Java的程序
- 【职场】优秀的人才有资格拥有有效的人脉!你足够优秀吗?