博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3579 Median
阅读量:5088 次
发布时间:2019-06-13

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

传送门:

题意

给你n个数,然后求它们两两相减的绝对值,然后找出这些绝对值的中中位数。 解题思路:

  1. 先对n个数排序,那么最后的结果ans一定满足0<=ans<an-a1
  2. 第二如何判断ans就是我们需要求的值能,我们用二分进行逼近。l=0,r=an-a1,mid=(l+r)/2;
  3. 二分如何逼近呢,如何判断我们要求的答案ans是在[l,mid]还是在[mid,r]部分呢?
  4. 很明显是原数组两个数相减的绝对值<mid个数,和>mid的个数进行比较。(绝对值的个数<mid,ans在[mid,r]区间,否则在[l,mid]区间内
  5. 如何判段两数绝对值<mid的个数呢?
  6. 如何求一个数减去a[0]的值小于mid的个数,我们找到一个a[i]>=a[0]+mid时最小的一个i,那么数组[0,i)值减去a[0],都小于mid,这样枚举i就可以求得两数相减差值小于mid的个数。
#include 
#include
#include
#include
using namespace std;const int MAXN=1000005;int val[MAXN];int N,M;bool calc(int mid){ int sum=0; //这儿如何计算绝对值
=M;}int main(){ while(scanf("%d",&N)!=EOF){ for(int i=0;i
1){ int mid=(l+r)>>1; if(calc(mid)) r=mid; else l=mid; } cout<
<

 

转载于:https://www.cnblogs.com/IKnowYou0/p/6698539.html

你可能感兴趣的文章
井底飞天
查看>>
<a>标签实现锚点跳跃,<a>标签实现href不跳跃另外加事件(ref传参)
查看>>
C# async/await异步操作:异步执行方法封装
查看>>
display:inline、block、inline-block的区别
查看>>
geotrellis使用(二十五)将Geotrellis移植到spark2.0
查看>>
新生代内存中为什么要有两个survivor区
查看>>
Loser’s “Brute-forced Cholesky Factorization for Sparse Matrix on CUDA”
查看>>
c#脚本控制shader
查看>>
SQL返回逗号分隔字符串或者其它符号
查看>>
Unity 游戏对象消失 enable,destroy与active的区别
查看>>
C++之new和malloc差别
查看>>
[LeetCode] Best Time to Buy and Sell Stock
查看>>
POJ2185-Milking Grid(KMP,next数组的应用)
查看>>
统计学习方法学习笔记(二)--经验风险最小化,结构风险最小化
查看>>
表单提交取不到表单中参数的正确值的问题小计
查看>>
Masonry 与 frame 混用导致的问题
查看>>
搭建个人博客
查看>>
Invalid byte tag in constant pool: 19 与 javax/el/ELManager问题解决
查看>>
SQL Server Like 与 通配符
查看>>
IDEA快捷键
查看>>