一、算法编程题(种树)
时间限制: 3000MS
内存限制: 1048576KB
题目描述:
每年的3月12日是我国的植树节,为了保证树苗的存活率,栽种每颗树苗都需要有一定的间隔,即不能种植在相邻的土地上,否则会发生争夺养分而导致树苗枯萎。你作为一名爱护坏境的Bytedancer分到了一块长度为n乘1的土地,即由n块地组成的一个数组,其中如果种了树的地块用“B”表示,没有种树的地块用“Y”表示,每个地块最多只能种一颗树苗,并且没有相邻地块种了树苗。请你计算出最多还能种多少棵树?
输入描述
第一行输入一个正整数N代表数组大小 1 ≤ N ≤ 10000。
第二行输入数组 bytetreed,其中bytetreed[i] 为 B 或 Y
输出描述
非负整数
示例1
输入:
5
B Y Y Y B
输出
1
示例2
输入:
4
Y Y Y B
输出
1
规则
请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果,点击“调试”亦可保持代码
本编程题不可以使用本地编译器
解题思路:
一、能种树的空缺位置为奇数个时:
如下图:索引i = 0~14,可种树的索引范围为0 ~ 2、6 ~ 8、12 ~ 14,每段都有3个位置可选。
1、首段:temp的初始值为-1,i从0指向4。在此过程中能种树的索引范围为:0~2(3个位置),此段最多可种的树num = i/2。
2、中间段:temp的值变为i的值,即从-1变为4。i从4指向10。在此段能种树的索引范围为:6~8(3个位置),此段最多为(i-temp-2)/2,最多可种的树num = num+(i-temp-2)/2。
3、末尾段:temp的值再更新为i的值,即从4变为10。i从10指向14。在此段能种树的索引范围为:12~14,此段最多为(i-temp)/2,最多可种的树num = num+(i-temp)/2。
二、能种树的空缺位置为偶数个时:
如下图:索引i = 0~15,可种树的索引范围为0 ~ 1、5 ~ 8、12 ~ 15,每段分别有2、4和4个位置可选
1、首段:temp的初始值为-1,i从0指向3。在此过程中能种树的索引范围为:0~1(2个位置),此段最多可种的树num = (i-1)/2。
2、中间段:temp的值变为i的值,即从-1变为3。i从3指向10。在此段能种树的索引范围为:5~8(4个位置),此段最多为(i-temp-3)/2,最多可种的树num = num+(i-temp-3)/2。
3、末尾段:temp的值再更新为i的值,即从3变为10。i从10指向15。在此段能种树的索引范围为:12~15(4个位置),此段最多为(i-temp-1)/2,最多可种的树num = num+(i-temp-1)/2。
综合一二,由于当可以插入的位置为偶数个(即,i-1、i-temp-3和i-temp-1都为偶数)时,首段(i-1)/2 = i/2;中间段(i-temp-3)/2 = (i-temp-2)/2;末尾段(i-temp-1)/2 = (i-temp)/2。
所以得出奇数段和偶数段的最大种植树苗的树苗通式为:
首段:num = i/2;
中间段:num = num+(i-temp-2)/2;
末尾段:num = num+(i-temp)/2。
参考代码:
import java.util.Scanner;
public class TikTok_Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[] arrs = sc.nextLine().split(" ");
int ans = plant(arrs);
System.out.println(ans);
}
public static int plant(String[] arrs){
int ans = 0;
int n = arrs.length;
int temp = -1;
for (int i=0; i 0时有以下情形(1.1.1)打中底侧墙面:
①重置x,y,n和tanh的值:x=y×tanh、y=0、tanh=1/tanh和n=n+1。
②递归调用此方法
(1.1.2)打中小A,直接返回值true。
(1.1.3)打中平底锅,直接返回值false。
(1.1.4)打中右侧墙面:
①重置x,y,n和tanh的值:x=6、y=y-6/tanh、tanh=-tanh和n=n+1。
②递归调用判断方法
(1.2)当tanh
(1.2.1)打中顶侧墙面:
①重置x,y,n和tanh的值:x=-(6-y)×tanh、y=6、tanh=1/tanh和n=n+1。
②递归调用此方法
(1.2.2)打中小A,直接返回值true。
(1.2.3)打中平底锅,直接返回值false。
(1.2.4)打中右侧墙面:
①重置x,y,n和tanh的值:x=6、y=y-6/tanh、tanh=-tanh和n=n+1。
②递归调用判断方法
(1.3)当tanh = 0时,返回false。
2、当y=0时,表示在底侧墙面。
与1同理。
3、当x=6时,表示在右侧墙面。
与1同理。
4、当y=6时,表示在顶侧墙面。
与1同理。
三、算法编程题(有序最大K位数)
时间限制: 2000MS
内存限制: 254288KB
题目描述:
给定N个数组成的序列,其中每个元素都是0~9之间的个数。要求从这个序列中找出K个元素,组成一个K位数,并且这K个元素在原N个数中的相对顺序不变。为这个K位数最大是多少?
输入描述
第一行 输入为N和K(1 ≤ N ≤ 1e6,1 ≤ K ≤ N),用空格分隔,其中N为无序序列的长度,K为需要得到的有序数长度。
第二行 依次输入N个个位数,用空格分隔,表示这个序列
输出描述
能够得到的最大K位数的数值(前缀0不输出)
示例1
输入:
2 2
1 2
输出
12
示例2
输入:
8 4
4 6 2 5 4 1 9 8
输出
6598
示例3
输入:
6 2
0 0 0 0 0 0
输出
0
规则
请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果,点击“调试”亦可保持代码
本编程题不可以使用本地编译器
解题思路:
1、将数组中索引为0 ~ n-k的数存入集合curList,如下图pre与i之间的数值(黄色区域)存入curList集合,并求出curList集合中的最大值6及索引。
2、将pre指针移到最大值索引后一位,将i向后移动一位。重新将pre与i之间数值(绿色区域)存入curList集合,并求集合里的最大值及索引。与上次求出的最大值6作拼接,得到65。
3、重新将pre指针移到最大值5索引后一位,将i向后移动一位。重新将pre与i之间的黄色区域存入curList集合,并求集合里的最大值及索引。与上次求出的最大值65作拼接得到659。
4、依次循环k次。
参考代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class TikTok_Test03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[n];
for (int i=0; i