Description
有n个机器,每个机器有2个芯片,每个芯片可以放k个电池。
每个芯片能量是k个电池的能量的最小值。
两个芯片的能量之差越小,这个机器就工作的越好。
现在有2nk个电池,已知它们的能量,我们要把它们放在n个机器上的芯片上,
使得所有机器的能量之差的最大值最小。
Input
第一行,两个正整数,n和k。
第二行,2nk个整数,表示每个电池的能量。
Output
一行一个整数,表示所有机器的能量之差的最大值最小是多少。
Solution
二分所有机器的能量之差的最大值,然后找到符合这一数值的芯片,标记起来,模拟一遍就好了。
Code
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int a[1000111],n,k,num; 6 bool b[1000111]; 7 8 bool check(int x) 9 { 10 int p=0,t=0; 11 for (int i=1; i<=num; i++) b[i]=false; 12 for (int i=2; i<=num; i++) 13 if ((b[i-1]==false)&&(a[i]-a[i-1]<=x))//标记能量最小值的芯片 14 { 15 t++; 16 b[i]=true; b[i-1]=true; 17 if (t==n) break; 18 } 19 if (t<n) return false; 20 t=0; 21 for (int i=num; i>=1; i--) 22 if (b[i]) 23 { 24 t++; //t表示当前找到几块能量最小值芯片 25 if (p<t*(k-1)) return false;//检验多余的芯片够不够放入机器而不影响最小值 26 if (t==n*2) break; 27 } 28 else p++;//p表示有几块多余芯片 29 return true; 30 } 31 32 int main() 33 { 34 cin>>n>>k; 35 num=2*n*k; 36 for (int i=1;i<=num;i++) 37 cin>>a[i]; 38 sort(a+1,a+num+1); 39 int left=0,right=a[num],mid,ans=0; 40 while (left<=right) 41 { 42 mid=(left+right)/2; 43 if (check(mid)) {ans=mid; right=mid-1;} 44 else left=mid+1; 45 } 46 cout<<ans<<endl; 47 return 0; 48 }
Source
http://www.lydsy.com/JudgeOnline/problem.php?id=3969