1. 程式人生 > >bzoj 3969 LOW Power

bzoj 3969 LOW Power

iostream false -- print led cst memory cnblogs can

3969: [WF2013]Low Power

Time Limit: 20 Sec Memory Limit: 256 MB

題目連接

http://www.lydsy.com/JudgeOnline/problem.php?id=3969

Description

有n個機器,每個機器有2個芯片,每個芯片可以放k個電池。 每個芯片能量是k個電池的能量的最小值。 兩個芯片的能量之差越小,這個機器就工作的越好。 現在有2nk個電池,已知它們的能量,我們要把它們放在n個機器上的芯片上, 使得所有機器的能量之差的最大值最小。

Input

第一行,兩個正整數,n和k。 第二行,2nk個整數,表示每個電池的能量。

Output

一行一個整數,表示所有機器的能量之差的最大值最小是多少。

Sample Input

2 3
1 2 3 4 5 6 7 8 9 10 11 12

Sample Output

1

HINT

2nk <= 10^6, 1 <= pi <= 10^9。

【題目大意】

讓最大差值的機器的值最小。

【思路】

二分答案

【code】

我對二分右端點有點疑問。有的dalao r=排序後最後一個 我怎麽覺得是 2*n*k-k+1個....

bzoj崩了...沒測...

先考慮二分什麽 ...二分的左右端點是什麽...

#include<iostream>
#include
<cstdio> #include<algorithm> using namespace std; int n,k,mid,ans,l,r; int w[1000005]; bool check() { /*for(int i=2*n;i;i--) { if(w[i]-w[i-1]>mid) return false; }*/ for(int p=1,q=1;p<=2*n*k&&q<=n;p++) { if(2*q*k!=p)return false;
if(w[p]-w[p-1]>mid)p++,q++; } return true; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=2*n*k;i++) scanf("%d",&w[i]); sort(w+1,w+2*n*k+1); // l=w[2]-w[1]; r=w[2*n*k-k+1]-w[1];//*** l=0;//最小兩個數的差不一定最小。 while(l<=r) { mid=l+(r-l)/2; if(check())ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); return 0; }

bzoj 3969 LOW Power