牛客 HJ24 合唱队
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客 HJ24 合唱队相关的知识,希望对你有一定的参考价值。
示例1
输入:
8
186 186 150 200 160 130 197 200
输出:
4
说明:
由于不允许改变队列元素的先后顺序,所以最终剩下的队列应该为186 200 160 130或150 200 160 130
java 实现
package nowcoder.x2x;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* @date 2022/7/26 10:28
*/
public class HJ024
public static void main(String[] args) throws Exception
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int line1 = Integer.parseInt(br.readLine());
String[] line2 = br.readLine().split(" ");
int[] t = new int[line1];
for (int i = 0; i < line1; i++)
t[i] = Integer.parseInt(line2[i]);
//存储每个数左边小于其的数的个数,left[i]代表左侧的最长递增个数
int[] left = new int[line1];
//存储每个数右边小于其的数的个数,right[i]代表右侧的最长递减个数
int[] right = new int[line1];
//计算每个位置左侧的最长递增
for (int i = 0; i < line1 - 1; i++)
left[i] = 1;
for (int j = 0; j < i; j++)
// 说明t[j]满足与t[i]是递增关系
if (t[i] > t[j])
// left[i]的转换方程,取Math.max(left[j] + 1, left[i])
left[i] = Math.max(left[j] + 1, left[i]);
//计算每个位置右侧的最长递减
for (int i = line1 - 1; i >= 0; i--)
right[i] = 1;
for (int j = line1 - 1; j > i; j--)
// 说明t[j]满足与t[i]是递减关系
if (t[i] > t[j])
// right[i]的转换方程,取Math.max(right[j] + 1, right[i])
right[i] = Math.max(right[j] + 1, right[i]);
// 记录每个位置的值 满足数i的左边是从左向右递增,数i的右边是从左往右的递减
int[] result = new int[line1];
for (int i = 0; i < line1; i++)
//位置i计算了两次 所以需要-1
result[i] = left[i] + right[i] - 1;
//找到最大的满足要求的值,即需要调整的数量就最小
int max = 1;
for (int i = 0; i < line1; i++)
max = Math.max(result[i], max);
System.out.println(line1 - max);
以上是关于牛客 HJ24 合唱队的主要内容,如果未能解决你的问题,请参考以下文章