NCSTOJ:供暖气

J : 供暖气
Time Limit:2 Sec Memory Limit:128 MiB
Back Submit Edit

Description
【二分,leetcode475】

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。

所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。

说明:

给出的房屋和供暖器的数目是非负数且不会超过 25000。

给出的房屋和供暖器的位置均是非负数且不会超过10^9。

只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。

所有供暖器都遵循你的半径标准,加热的半径也一样。

加热半径一定是正整数

Input
第一行n, m 分别表示房屋和供暖器的数量

第二行n个整数

第三行m个整数

Output
输出供暖器的最小加热半径
Sample Input
3 1
1 2 3
2
Sample Output
1
More Info
对样例1的解释:

仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。

样例2:

输入:

4 2

1 2 3 4

1 4

输出:

1

解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=25010;
int n,m;
int heaters[maxn],houses[maxn];//定义房屋和暖气的位置数组
bool check(int r)  //判断该供暖半径是否能使全部房屋受热
{
for(int i=0,j=0;i<n;i++)//i是指向房屋的指针,j是指向暖气的指针
{
while(abs(houses[i]-heaters[j])>r&&j<m)
	j++; //当,当前暖气不能给当前房屋供暖时(当然上一个暖气也不能给当前房屋供暖),循环判断下一个暖气是否能给当前房屋供暖

//当所有暖气判断完,但房屋还没全部供暖时,该半径不能使全部房屋供暖
if(j==m)return false;



}
return true;



}


int main(){
	//freopen("qwe.txt","r",stdin);
	
cin>>n>>m;
for(int i=0;i<n;i++)
	cin>>houses[i];
//在输入房屋和暖气的位置数组中要从0位置开始,因为后边要用到排序方法,以防发生错误
for(int j=0;j<m;j++)
	cin>>heaters[j];
sort(heaters,heaters+m);
sort(houses,houses+n);//房屋和暖气的输入顺序可能是无序的。
      int l=0,r=max(heaters[m-1],houses[n-1]);//定义二分法的左右端点 右端点最大半径就是房屋和暖气中位置最大的那个值
      while(l<r)
      {         //二分方法模板
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;



      }  
              
cout<<l<<endl;
return 0;

          
         
            
          
   

}

猜你喜欢

转载自blog.csdn.net/qq_42635159/article/details/89314138