Y sin embargo, otra es la mitad de ella
daft melocotones aquí de nuevo
Tema: enlaces de gastos mensuales
题目描述:
Farmer John es un asistente de contabilidad asombrosa y se ha dado cuenta de que podría quedarse sin dinero para ejecutar la granja. Él ya ha calculado y registrado la cantidad exacta de dinero (1 ≤ moneyi ≤ 10.000) que tendrá que pasar cada día durante el próximo N (1 ≤ N ≤ 100.000) días.
FJ quiere crear un presupuesto para un conjunto secuencial de exactamente M (1 ≤ M ≤ N) períodos fiscales llamados “fajomonths”. Cada uno de estos fajomonths contiene un conjunto de 1 o más días consecutivos. Todos los días se contiene en exactamente una fajomonth.
El objetivo de FJ es organizar las fajomonths a fin de minimizar los gastos de la fajomonth con el mayor gasto y determinar así su límite de gasto mensual.
输入:
Línea 1: Dos enteros separados por un espacio: N y M
líneas 2 ... N + 1: Línea i + 1 contiene el número de dólares Farmer John pasa el día ITH
输出:
Línea 1: El límite mensual más pequeño posible Farmer John puede permitirse el lujo de vivir.
No es el costo de n días, que se dividirán en m meses, buscando el máximo coste mínimo.
Esta pregunta y el río rayuela que pregunta mucho como que
en el río rayuela Problema Solución
prestar atención
1.Low debe pasar el máximo diario, alta igual al costo total.
2. Total de pasar unos días con una variable estadística, cuando el costo es superior a mediados, núm ++, si num <tiempo = m, lo que sea mayor mediados descrito, esta vez para cambiar el alto valor (en este caso, hay que prestar atención!num poco tiempo fue a mediados de grande! ! ! Dibuje enfoque!)
la implementación del código
#include<stdio.h>
int main()
{
int n,m,i,low=0,high=0,mid,a[100010];
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(low<a[i]) low=a[i];
high+=a[i];
}
while(low<high){
mid=(low+high)/2;
int num=1,sum=0;
for(i=0;i<n;i++)
{
if(sum+a[i]<=mid) sum+=a[i];
else{
sum=a[i];
num++;
}
}
if(num<=m) high=mid-1;
else low=mid+1;
}
printf("%d\n",high);
return 0;
}