其他分享
首页 > 其他分享> > 月度开销

月度开销

作者:互联网

农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 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