zoukankan      html  css  js  c++  java
  • [USACO07MAR]每月的费用Monthly Expense

    题目:POJ3273、洛谷P2884。

    题目大意:有n个数,要分成m份,每份的和要尽可能小,求这个情况下和最大的一份的和。

    解题思路:二分答案,对每个答案进行贪心判断,如果最后得出份数>m,则说明答案在[mid+1,r]内,反之在[l,mid]内。我的二分上界是所有数的总和,所以时间复杂度$O(nlog (sum_{i=1}^{n}a[i]))$。

    结果我贪心没考虑全,爆了一发O(≧口≦)O

    C++ Code:

    #include<cstdio>
    using namespace std;
    int n,m,a[100005];
    long long s;
    bool ok(int x){
    	int p=1;
    	long long ns=0;
    	for(int i=1;i<=n;++i){
    		if(ns+a[i]<=x)ns+=a[i];
    		else{
    			++p;
    			ns=a[i];
    			if(ns>x)return false;
    		}
    	}
    	return p<=m;
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	s=0;
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    		s+=a[i];
    	}
    	long long l=0,r=s,ans;
    	while(l<=r){
    		long long mid=l+r>>1;
    		if(ok(mid)){
    			ans=mid;
    			r=mid-1;
    		}else l=mid+1;
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Swift8-枚举Enumerations
    Swift7-闭包
    Swift6-函数
    Swift5-控制流
    Swift4-集合类型
    什么是node.js
    nodejs的安装
    环境变量的认识,,,
    shell是什么,各种shell的初步认识,适用于初学者
    exports和module.exports的区别
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7389722.html
Copyright © 2011-2022 走看看