bzoj 3969 LOW Power
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
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; }