赞
踩
爱丽丝要完成一项修剪灌木的工作。
有 N N N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 0 0 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 1 1 厘米, 而其余时间不会长高。在第一天的早晨, 所有灌木的高度都是 0 0 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
一个正整数 N N N ,含义如题面所述。
输出 N N N 行, 每行一个整数, 第行表示从左到右第 i i i 棵树最高能长到多高。
3
4
2
4
对于第 i i i 棵树的最大高度,实际就是 从第 i i i 棵树离开,下一次到达第 i i i 棵数的最大时间间隔 t t t,实际也就是最大的距离。
左边的距离为 ( i − 1 ) × 2 (i - 1) \times 2 (i−1)×2,右边的距离为 ( n − i ) × 2 (n - i) \times 2 (n−i)×2。
那么第 i i i 棵树的最大高度就是 m a x { ( i − 1 ) × 2 , ( n − i ) × 2 } max\{ (i - 1) \times 2, (n - i) \times 2 \} max{(i−1)×2,(n−i)×2}。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
#include <iostream> #include <algorithm> #include <vector> using namespace std; void solve() { int n; cin>>n; vector<int> ans(n + 1); for(int i = 1;i <= n;i++) ans[i] = max(i - 1, n - i) * 2; for(int i = 1;i <= n;i++) cout<<ans[i]<<'\n'; } int main(){ int t = 1; while(t--) { solve(); } return 0; }
Java代码:
import java.util.*; import java.io.*; public class Main { static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception{ int n = Integer.parseInt(in.readLine()); int[] ans = new int[n + 5]; for(int i = 1;i <= n;i++) { ans[i] = Math.max(i - 1, n - i) * 2; } for(int i = 1;i <= n;i++) { System.out.println(ans[i]); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。