日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客--合唱队

發布時間:2024/7/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客--合唱队 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

計算最少出列多少位同學,使得剩下的同學排成合唱隊形

說明:

N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK,???則他們的身高滿足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

請注意處理多組輸入輸出!

?

輸入描述:

整數N

輸出描述:

最少需要幾位同學出列

示例1

輸入

復制

8 186 186 150 200 160 130 197 200

輸出

復制

4

思路:求遞增子序列

把每個位置都先看作中心點

先求出每個位置左邊和右邊比他小的子序列

之后找出左右子序列之和最大的中心節點即可,這就是最終的隊列,用總數減去這個隊列的數量。

例如:186是第一個,左邊沒有值,他的左子序列長度為1。第二個186,左邊和他的值一樣,所以左邊沒有比他小的,他的左子序列也是1。150左邊沒有比他小的,他的左子序列也是1。200左邊可以是150或者186,所以他的左子序列是2。

代碼:

import java.util.*;
public class Main{
? ? public static void main(String[] args){
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? while(sc.hasNext()){
? ? ? ? ? ? int n = sc.nextInt();
? ? ? ? int nums[] = new int[n];
? ? ? ? int left[] = new int[n];
? ? ? ? int right[] = new int[n];
? ? ? ? for(int i=0;i<n;i++){
? ? ? ? ? ? nums[i] = sc.nextInt();
? ? ? ? ? ? left[i] = 1;
? ? ? ? ? ? right[i] = 1;
? ? ? ? }
? ? ? ? for(int i=1;i<n;i++){
? ? ? ? ? ? int max = 0;
? ? ? ? ? ? for(int j=i-1;j>=0;j--){
? ? ? ? ? ? ? ? if(nums[i]>nums[j])
? ? ? ? ? ? ? ? max = Math.max(max,left[j]);
? ? ? ? ? ? }
? ? ? ? ? ? left[i]+=max;
? ? ? ? }
? ? ? ? for(int i=n-2;i>=0;i--){
? ? ? ? ? ? int max = 0;
? ? ? ? ? ? for(int j=i+1;j<n;j++){
? ? ? ? ? ? ? ? if(nums[i]>nums[j])
? ? ? ? ? ? ? ? max = Math.max(max,right[j]);
? ? ? ? ? ? }
? ? ? ? ? ? right[i]+=max;
? ? ? ? }
? ? ? ? int max = 1;
? ? ? ? for(int i=0;i<n;i++){
? ? ? ? ? ? max = Math.max(max,left[i]+right[i]);
? ? ? ? }
? ? ? ? System.out.println(n-max+1);
? ? ? ? }
? ? ? ??
? ? }
}

總結

以上是生活随笔為你收集整理的牛客--合唱队的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。