• 洛谷 [P1182] 数列分段


    这是一道典型的二分答案问题(最大值最小,最小值最大)关键是对于细节的处理。
    二分的框架:

    //l=max{num[i]},r=sum{num[i]}
    while(l<=r){
    		int m=(l+r)>>1;
    		if(chk(m)){
    			r=m-1;
    		}else l=m+1;
    	}
    	cout<<l;
    

    二分的框架是普遍使用的,关键是检验函数的设计,此处的检验函数的含义为: 是否存在一种合法的划分,使得每段的最大值都不大于m。
    设计好了检验函数,就要思考l与r的转移:若存在这种合法的划分,说明m偏大,r=m-1;反之,l=m+1.
    此处应注意l的初始值为num中的最大值。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int read(){
    	int rv=0,fh=1;
    	char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-') fh=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){
    		rv=(rv<<1)+(rv<<3)+c-'0';
    		c=getchar();
    	}
    	return fh*rv;
    }
    int n,m,num[100005],pre[100005];
    bool chk(int x){
    	int tot=0,last=0;
    	for(int i=1;i<=n;i++){
    		if((pre[i]-pre[last])>x){
    			tot++;
    			last=i-1;
    		}
    	}
    	tot++;
    	if(tot<=m) return 1;
    	else return 0;
    } 
    int main(){
    	freopen("in.txt","r",stdin);
    	n=read();m=read();
    	int l=1,r,m=0;
    	for(int i=1;i<=n;i++){
    		num[i]=read();
    		l=max(l,num[i]);
    		pre[i]=pre[i-1]+num[i];
    	}	
    	r=pre[n];
    	while(l<=r){
    		int m=(l+r)>>1;
    		if(chk(m)){
    			r=m-1;
    		}else l=m+1;
    	}
    	cout<<l;
    	int t;
    	fclose(stdin);
    	return 0;
    }
    
    
  • 相关阅读:
    react篇章-React State(状态)
    react篇章-React 组件-复合组件
    react篇章-React 组件-向组件传递参数
    react篇章-React 组件-ES6 class 来定义一个组件
    React篇章-React 组件
    复习常用算法_冒泡算法
    项目管理小结(如何做好一个百万级项目甚至千万级别的项目)
    AOP切点切面内容
    Spring 框架
    Spring MVC 框架
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868358.html
Copyright © 2020-2023  润新知