photon回国用要解锁吗?# PDA - 掌中宝
A*r
1 楼
受到大虾的指点,本题除了DP算法,还有非DP的简单算法, 我的理解如下:
思路就是利用给定的数组范围确定pair distance的最大值和最小值,在这个范围里寻找一个最大的半径X,使得这个半径有K个元素两两距离不小于X;但所有比这个半径大的数,都只有少于K个元素的子集。
这个的算法复杂度是O(MN), 如果还要继续优化的话,就是在查找X的时候用上binary search, 把算法复杂度降为O(MlogN)。(当然前提也是要sort数组先O(M*logM)或者O(M))。
min=0;
max=N;
while(min {
x=(min+max)/2;
count=1;
prev=a[0];
for(i=1;i {
if(a[i]-prev>=x)
count++;
if(count>=k) break;
}
if(count else min=x;
}
==================================
思路就是利用给定的数组范围确定pair distance的最大值和最小值,在这个范围里寻找一个最大的半径X,使得这个半径有K个元素两两距离不小于X;但所有比这个半径大的数,都只有少于K个元素的子集。
这个的算法复杂度是O(MN), 如果还要继续优化的话,就是在查找X的时候用上binary search, 把算法复杂度降为O(MlogN)。(当然前提也是要sort数组先O(M*logM)或者O(M))。
min=0;
max=N;
while(min
x=(min+max)/2;
count=1;
prev=a[0];
for(i=1;i
if(a[i]-prev>=x)
count++;
if(count>=k) break;
}
if(count
}
==================================