NC252730. 幼稚园的树2
描述
牛牛在幼稚园做义工,幼稚园中共有 棵树,第 1 天中午时它们的高度分别为:
(单位:毫米)。
每一天的晚上第 棵树的高度会增加
毫米,而牛牛的任务则是在第二天的清晨检查每一棵树的高度,若某棵树的高度超过了
毫米牛牛就会将它的高度修剪为
毫米。
牛牛想请你帮它计算一下第 天中午每一棵树的高度。
输入描述
本题采用多组案例输入,第一行一个整数
代表案例组数。
每组案例中,第一行输入四个空格分隔的整数分别代表:
。
接下来一行输入
个由空格分隔的整数代表:
。
接下来一行输入
个由空格分隔的整数代表:
。
保证:![]()
![]()
单个测试点中所有案例的和不超过
输出描述
对于每组案例,输出一行个空格分隔的整数代表第
天中午每棵树的高度(单位:毫米),案例与案例之间用换行分隔。
示例1
输入:
2 1 1 10 3 10 20 3 4 10 3 1 5 4 20 3 2
输出:
10 3 6 10
C++(g++ 7.5.0) 解法, 执行用时: 148ms, 内存消耗: 2224K, 提交时间: 2023-06-09 21:23:15
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int a[200005],h[200005]; int main() { int t; cin>>t; while(t--) { int m,n,k,b; cin>>n>>m>>k>>b; for(int i=1; i<=n; i++)cin>>h[i]; for(int i=1; i<=n; i++)cin>>a[i]; for(int i=1; i<=n; i++) { int res=(k-h[i])/a[i]; if(res<=0)res=1; else res++; int res1=(k-b+a[i])/a[i]; if(res>=m)printf("%d ",h[i]+(m-1)*a[i]); else printf("%d ",b+ (m-1-res)%res1*a[i]); } printf("\n"); } return 0; }
Python3 解法, 执行用时: 1168ms, 内存消耗: 21888K, 提交时间: 2023-06-09 20:44:43
def ceil(x): return int(x + 1) T = int(input()) while T: T -= 1 n, m, k, b = (int(x) for x in input().split()) h = [int(x) for x in input().split()] a = [int(x) for x in input().split()] m -= 1 for i in range(n): m1 = ceil((k - h[i]) / a[i]) if m1 > m: print(m * a[i] + h[i], end=' ') continue m2 = ceil((k - b) / a[i]) m3 = (m - m1) % m2 print(m3 * a[i] + b, end=' ') print()
C++(clang++ 11.0.1) 解法, 执行用时: 645ms, 内存消耗: 3012K, 提交时间: 2023-06-16 19:09:24
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N=2e5+10; ll t,n,m,k,b,d; ll h[N],a[N]; int main() { cin>>t; while(t--){ cin>>n>>m>>k>>b; m--; for(int i=1;i<=n;i++) cin>>h[i]; for(int i=1;i<=n;i++){ cin>>a[i]; d=(k-h[i]+a[i])/a[i]; if(d>m) cout<<h[i]+a[i]*m<<" "; else{ ll x=m-d; d=(k-b+a[i])/a[i]; cout<<b+(x%d)*a[i]<<" "; } } cout<<endl; } }