题目:幼稚园的树2

牛牛在幼稚园做义工,幼稚园中共有 n 棵树,第 1 天中午时它们的高度分别为:ℎ1,ℎ2,…,ℎn(单位:毫米)。

每一天的晚上第 i 棵树的高度会增加 ai毫米,而牛牛的任务则是在第二天的清晨检查每一棵树的高度,若某棵树的高度超过了 k 毫米牛牛就会将它的高度修剪为 b 毫米。

牛牛想请你帮它计算一下第 m 天中午每一棵树的高度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;

int cut(int h,int ch,int ach,int gr,int day)//初始高度,要修剪的高度,修剪后高度,每天生长高度,天数
{
int cd1 = (ch-h)/gr+1;//第一轮到初始值需要的时间
if(day<cd1) return h+gr*day;
else day-=cd1,h=ach;

int cut_r = (ch-ach)/gr+1;//修剪后要生长的高度/每天生长高度 向上取整 => 每次修剪间隔的时间
return ach+gr*(day%cut_r);
}

int t;
int n,m,k,b;

int tree[N];
int grow[N];

int main()
{
//cout<<cut(4,10,3,2,4);//初始高度为4,长到10后修建为3,每天长2,长4天
cin>>t;
while(t--)
{
cin>>n>>m>>k>>b;//树数,第m天,长到k剪为b
for(int i=0;i<n;i++) scanf("%d",&tree[i]);
for(int i=0;i<n;i++) scanf("%d",&grow[i]);

for(int i=0;i<n;i++) cout<<cut(tree[i],k,b,grow[i],m-1)<<" ";
cout<<endl;
}



return 0;
}