月度开销
作者:互联网
农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。
输入第一行包含两个整数N,M,用单个空格隔开。接下来N行,每行包含一个1到10000之间的整数,按顺序给出接下来N天里每天的开销。输出一个整数,即最大月度开销的最小值。
样例输入
7 5
100
400
300
100
500
101
400
样例输出
500
#include<stdio.h> int N, M;//N次开销,M个周期 int a[100000]; int maxmoney = 0; int days(int p) { int i = 0, cnt = 0;//周期数 while(i < N) { int sum = 0; if (sum + a[i] <= p) { while (sum + a[i] <= p) { sum += a[i]; ++i; } } else ++i; cnt++; } return cnt; } int main() { freopen("E:\\IDMdowanload\\in.txt", "r", stdin); scanf("%d %d", &N, &M); int sum = 0, max = 0; for (int i = 0; i < N; ++i){ scanf("%d", &a[i]); if (a[i] > max)max = a[i]; sum += a[i]; } int l = max, r = sum;//一天或连续多天的开销[max,sum] while (l < r) { int mid = (l + r) / 2; int cnt = days(mid); if (cnt > M) l = mid + 1; else r = mid - 1; } printf("%d", r); return 0; }
标签:开销,int,max,sum,mid,fajo,月度 来源: https://www.cnblogs.com/orange-ga/p/12492156.html