题目链接
http://bailian.openjudge.cn/practice/4135/
解题分析
题目的意思是,从给的n天花销中划分成m个财政周期,这m个财政周期求其中最大的财政周期最小化。
如果这个题用枚举来做的话,对于这个最大最小财政周期 a 的取值范围[max, total],对范围内每一个整数做一次测试,测试它是否能满足每个划分不超过a,并且划分数要小于等于m。(比m小的划分还可以再拆一拆凑成m个划分,并且能够满足每个划分不超过a)。
如果可以尝试这个最大最小财政周期为a,那么比a大的最大最小财政周期都可以满足条件,如果使用二分法对a的可能取值范围进行查找,可以加快算法速度,不至于超时。
解题代码
//
// main.cpp
// 4135:月度开销
//
// Created by apple on 2020/3/30.
// Copyright © 2020 apple. All rights reserved.
//
#include <cstdio>
#include <cstring>
#define MAX 100010
int a[MAX];
int n, m;
bool test(int);
int main(){
int max = 0, total = 0;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%d", a + i);
if(max < a[i]) max = a[i];
total += a[i];
}
int result;
int l = max, r = tatal, m;
while(l <= r){
m = l + (r - l)/2;
if(test(m)){
result = m;
r = m - 1;
}
else
l = m + 1;
}
printf("%d
", result);
return 0;
}
bool test(int min){
int sum = 0, month = 1;
for(int i = 0; i < n; i++){
if(a[i] + sum > min) {
sum = a[i];
month++;
}
else
sum += a[i];
}
if(month <= m) return true;
else return false;
}