zoukankan      html  css  js  c++  java
  • H

    - 题目大意

        农夫约翰搭了一间有n间牛舍的小屋。牛舍排在一条线上第i号牛舍在xi的位置。但是他的m头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。

    - 解题思路

       很明显是一个最大值最小化的问题,因此我们可以假设C(d)为满足所有牛之间的距离都不小于d。先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d。

    - 代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int MAX = 100001;
    int n, m;
    int num[MAX];
    
    bool find(int d)
    {
    	int last = 0;
    	for (int i = 1; i < m; i++)
    	{
    		int crt = last + 1;
    	while (crt < n&&num[crt] - num[last] < d)
    	{
    		crt++;
    	}
    	if (crt == n)
    		return false;
    	last = crt;
    }
    	return true;
    }
    int main()
    {
    	cin >> n >> m;;
    		for (int i = 0; i < n; i++)
    			cin >> num[i];
    		sort(num, num + n);
    		int lb = 0,ub = (num[n-1]-num[0])/(m-1);
    		while(ub-lb>1)
    		{
    			int mid = (lb + ub) / 2;
    			if (find(mid))
    				lb = mid;
    			else
    				ub = mid;
    		}
    		cout << lb<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    paxos算法
    List
    es资料汇总
    尚硅谷Kafka
    lostach安装配置
    zookeeper安装
    zookeeper配置详解
    C# 微信企业付款给个人之相关配置
    JS--正则表达式验证
    uniapp小程序--自定义分享标题
  • 原文地址:https://www.cnblogs.com/alpacadh/p/8449417.html
Copyright © 2011-2022 走看看