【华为机试】合唱队

题目描述

计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:

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

分析:此题是最大连续子串的变形,动态规划思想。我们可以从左到右求一次最大连续子串,从右到左求一次最大连续子串,然后把对应位置的2值相加就求得以此值为中间值的最大连续子串。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

inline void maxcon(vector<int> t,vector<int> &res){
	if(t.size()<=1)  return;
	for(int i=1;i<t.size();++i){   //找到在t[i]之前比t[i]小的最大连续子串;
		int k=0;
		for(int j=0;j<i;++j)
			if(t[j]<t[i])k=max(k,res[j]);
		res[i]=k+1;
	}
}

int main(){    //最大连续子串;
	int n;
	while(cin>>n){
		vector<int> t1,t2,res1(n,1),res2(n,1);
		for(int i=0,j;i<n;++i){
			cin>>j;
			t1.push_back(j);   //把n个数保存在容器中;
			t2.insert(t2.begin(),j);   //反序保存在t2中;
		}
		maxcon(t1,res1);
		maxcon(t2,res2);    //t2可以用reverse(t1.begin(),t1.end());之后的t1代替;
		int i=0,k=0;
		while(i<res1.size()){
			k=max(res1[i]+res2[n-1-i],k);++i;
		}
		cout<<n-k+1<<endl;   //中间值多减一次;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值