列表

详情


NC252730. 幼稚园的树2

描述

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

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

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

输入描述

本题采用多组案例输入,第一行一个整数 T 代表案例组数。

每组案例中,第一行输入四个空格分隔的整数分别代表:n\ m\ k\ b

接下来一行输入 n 个由空格分隔的整数代表:h_1,h_2,…,h_n

接下来一行输入 n 个由空格分隔的整数代表:a_1,a_2,…,a_n

保证:
0 < n,m,k \le 10^5 
0 < h_i,b \le k 
0 < a_i \le 10^5 
单个测试点中所有案例 n 的和不超过 2\times 10^5

输出描述

对于每组案例,输出一行 n 个空格分隔的整数代表第 m 天中午每棵树的高度(单位:毫米),案例与案例之间用换行分隔。

示例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;
	}
}

上一题