zoukankan      html  css  js  c++  java
  • POJ2456(最大化最小值)解题报告

    原题链接:POJ2456

    题意简述:求在1~N中选C个位置,每俩个位置之间距离最小的值最大化。

    思路:让距离最小的那个距离最大。可以看出来答案具有单调性,那我们就可以转求解为判定,用二分搜索来求结果。具体做法就是假定一个答案,再不断缩小答案范围,最终得到解。

    注意点:while循环内的判定条件需要仔细考虑,稍有改变就会有截然不同的结论。

    代码示例:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 1e5+10;
    int stall[maxn];
    int n,c;
    bool C(int size){
    	int cnt = 1;
    	int last = 0;
    	for(int i = 1;i < n;i++){
    		if(stall[i] - stall[last] >= size) cnt++,last = i;
    	}
    	return cnt >= c;
    }
    int main(){
    	scanf("%d%d",&n,&c);
    	for(int i = 0;i < n;i++)
    		scanf("%d",stall+i);
    	sort(stall,stall+n);
    	long long l = 0,r = 3e9;
    	while(l < r){
    		int mid = (l + r)/2;
    		if(C(mid)) l = mid+1;
    		else r = mid;
    	}	
    	printf("%lld
    ",l-1);
    	return 0;
    }

    至于为什么最后答案是l-1呢?假设到了最后一个成立的答案mid,此时l = mid + 1 ,那么下一个必定不成立并l = r退出,此时答案其实为l - 1,即上述的mid。

  • 相关阅读:
    C、C++混合调用
    20211027 投资策略优化
    2021投资策略
    程序猿多个对象的友好管理方式IOC容器
    欧几里德算法--求最大公约数
    C语言查找一个字符串中指定字符的个数
    linux下OpenSSL的RSA密钥生成
    文章目录
    python之禅
    EF 6.0 与sql ce 4.0 程序示例
  • 原文地址:https://www.cnblogs.com/long98/p/10352156.html
Copyright © 2011-2022 走看看