Bear has a large, empty ground for him to build a home. He decides to build a row of houses, one after another, say n in total.
The houses are designed with different height. Bear has m workers in total, and the workers must work side by side. So at a time bear can choose some continuous houses, no more than m , and add their heights by one, this takes one day to finish.
Given the designed height for each house, what is the minimum number of days after which all the houses’ heights are no less than the original design?
Input
The first line of input contains a number T , indicating the number of test cases. ( T≤50 )
For each case, the first line contains two integers n and m : the number of houses and the number of workers. The next line comes with n non-negative numbers, they are the heights of the houses from left to right. ( 1≤n,m≤100,000 , each number will be less than 1,000,000,000 )
Output
For each case, output Case #i:
first. (
i
is the number of the test case, from
1
to
T
). Then output the days when bear’s home can be built.
Sample Input
["2\n3 3\n1 2 3\n3 3\n3 2 1"]
Sample Output
["Case #1: 3\nCase #2: 3"]
题目的意思就是 见房子,工人可以一起工作, 而且 最多只能每天造m个房子, 且每个房子的增加高度只能是1. 故 该题就是一道贪心的题目了~从左边开始向右边扫描,~~
注意 时间的定义要用 long long 来 且输出得用 lld~~~~、
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int s[1000010];
int gao[1000010];
int main()
{
int bbs,i,j,k=1;
scanf("%d",&bbs);
while(bbs--)
{
long long ant=0;
int n,m,d;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
memset(gao,0,sizeof(gao));
for(i=1;i<=n;i++)
{
if(i-1>=1) gao[i]+=gao[i-1];
if(s[i]>gao[i])
{
d=s[i]-gao[i];
gao[i]+=d;
ant+=d;
if(i+m<=n) gao[i+m]=-d;
}
}
printf("Case #%d: %lld\n",k++,ant);
}
return 0;
}