码迷,mamicode.com
首页 > 其他好文 > 详细

华为机试题——合唱团

时间:2016-06-25 20:26:55      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
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
输出描述:
最少需要几位同学出列
输入例子:
8
186 186 150 200 160 130 197 200
输出例子:
4
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int DeleteNum(vector<int> &vec);

int main() {
    int N;
    cin >> N;
    vector<int> vec;
    for (int i = 0; i < N; ++i) {
        int height;
        cin >> height;
        vec.push_back(height);
    }
    vector<int> DelNum(N, 0);
    for (int i = 0; i < N; ++i) {
        vector<int> Left;
        vector<int> Right;
        for (int k = 0; k < N; ++k) {
            if (k <= i)
                Left.push_back(vec[k]);
            if (k >= i)
                Right.push_back(vec[k]);
        }
        reverse(Right.begin(), Right.end());
        DelNum[i] = DeleteNum(Left) + DeleteNum(Right);
    }
    int min = DelNum[0];
    for (int i = 0; i < N; ++i) {
        if (min > DelNum[i])
            min = DelNum[i];
    }
    cout << min << endl;
    return 0;
}

int DeleteNum(vector<int> &vec) {
    if (vec.size() == 1)
        return 0;
    vector<int> f(vec.size(), 0);
    int N = vec.size();
    f[0] = 1;
    for (int i = 0; i < N; ++i) {
        f[i] = 1;
        for (int j = 0; j < i; ++j) {
            if (vec[j] < vec[i] && f[j] > f[i] - 1)
                f[i] = f[j] + 1;
        }
    }
    return N - f[N - 1];
}

  

华为机试题——合唱团

标签:

原文地址:http://www.cnblogs.com/VanDiem/p/5616814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!