Saki也想要变强之Saki的一日一题(5)
题目描述
今天小田田去看了电影《姜子牙》,回来的路上在思考一个问题,如果姜子牙想去幽都城总共要经过n个城池,而他要分为m次按顺序通过这n个城池,这m次前进每次消耗的体力为该次通过城池所消耗体力之和,现在要使姜子牙这m次前进中消耗体力的最大值最小,那么这个最大值将是多少。
输入
第一行两个正整数n,m
第二行为通过这n个城池消耗的体力
输出
m次前进中消耗体力最大值的最小值
代码:
include<stdio.h>
int check(int* nums, int numsSize, int m, int x) {
long long sum = 0;
int cnt = 1,i;
for (i = 0; i < numsSize; i++) {
if (sum + nums[i] > x) {
cnt++;
sum = nums[i];
} else {
sum += nums[i];
}
}
return cnt <= m;
}
int splitArray(int* nums, int numsSize, int m) {
long long left = 0, right = 0,i;
for (i = 0; i < numsSize; i++) {
right += nums[i];
if (left < nums[i]) {
left = nums[i];
}
}
while (left < right) {
long long mid = (left + right) >> 1;
if (check(nums, numsSize, m, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
int main()
{
int a[100010] ;
int i, n, m ;
scanf("%d", &n) ;
scanf("%d", &m) ;
for(i=0; i<n; i++){
scanf("%d", &a[i]) ;
}
printf("%d",splitArray(a,n,m)) ;
return 0 ;
}
心得明天~


浙公网安备 33010602011771号