博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3273 Monthly Expense
阅读量:4699 次
发布时间:2019-06-09

本文共 891 字,大约阅读时间需要 2 分钟。

题意:按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间)。

思路:由于函数具有单调性的特征,因此可以用二分枚举的办法去实现它,这与POJ3258有非常相似的地方,但这里不需要排序。

 

CODE:

 

 

#include <cstdio>
#include <cstdlib>
#include <iostream>
using 
namespace std;
const 
int SIZE = 
100010;
int a[SIZE];
int low_bound, high_bound;
int n, m;
int BSearch(
int x, 
int y, 
int m)
{
    
int mid;
    
while(x <= y)
    {
        
int group = 
1, sum = 
0;
        mid = (x+y)>>
1;
        
for(
int i = 
1; i <= n; i++)
        {
            
if((sum+=a[i]) <= mid);
            
else
            {
                group++;
                sum = a[i];
            }
        }
        
if(group > m) x = mid+
1;
        
else y = mid-
1;
    }
    
return x;
}
int main()
{
    
while(~scanf(
"
%d%d
", &n, &m))
    {
        low_bound = -
1;
        high_bound = 
0;
        
for(
int i = 
1; i <= n; i++)
        {
            scanf(
"
%d
", &a[i]);
            low_bound = max(low_bound, a[i]);
            high_bound += a[i];
        }
        
int ans = BSearch(low_bound, high_bound, m);
        printf(
"
%d\n
", ans);
    }
    
return 
0;
}

 

转载于:https://www.cnblogs.com/g0feng/archive/2012/09/04/2670704.html

你可能感兴趣的文章
P2709 小B的询问
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>
【.Net基础03】HttpWebRequest模拟浏览器登陆
查看>>
zTree async 动态参数处理
查看>>
Oracle学习之常见错误整理
查看>>
数据库插入数据乱码问题
查看>>
altium annotate 选项设置 complete existing packages
查看>>
【模式识别与机器学习】——SVM举例
查看>>
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>