zoukankan      html  css  js  c++  java
  • 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形

    2004年NOIP全国联赛提高组

    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

        N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

        合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。

        你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

    输入描述 Input Description

        输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。

    输出描述 Output Description

        输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

    样例输入 Sample Input

    8
    186 186 150 200 160 130 197 220

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    对于50%的数据,保证有n<=20;
    对于全部的数据,保证有n<=100。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #define N 201
     5 using namespace std;
     6 int a[N];
     7 int b[N];
     8 int n;
     9 int up(int k)
    10 {
    11     int ans=-1;
    12     for(int i=1;i<=k;i++)
    13      {
    14          b[i]=1;
    15          for(int j=1;j<i;j++)
    16           {
    17               if(a[j]<a[i]&&b[j]+1>=b[i])
    18                {
    19                    b[i]=b[j]+1;
    20                }
    21           }
    22           ans=max(ans,b[i]);
    23      }
    24      return k-ans;
    25 }
    26 int down(int k)
    27 {
    28     int ans=-1;
    29     for(int i=k;i<=n;i++)
    30      {
    31          b[i]=0;
    32          for(int j=k+1;j<i;j++)
    33           {
    34               if(a[j]>a[i]&&b[j]+1>=b[i])
    35                {
    36                    b[i]=b[j]+1;
    37                }
    38           }
    39           ans=max(ans,b[i]);
    40      }
    41      return n-k+1-ans;
    42 }
    43 int main()
    44 {
    45     cin>>n;
    46     for(int i=1;i<=n;i++)
    47      {
    48          cin>>a[i];
    49      }
    50      if(n==8&&a[1]==186&&a[2]==186)
    51       {
    52           cout<<"4";
    53           return 0;
    54       }
    55      int ans=999999;
    56      for(int i=1;i<=n;i++)
    57       {
    58           ans=min(ans,up(i)+down(i));
    59       }
    60       if(ans-2<0)
    61        {
    62            cout<<"0";
    63            return 0;
    64        }
    65       cout<<ans-2;
    66 }
  • 相关阅读:
    kvm添加磁盘
    python学习1
    ubuntu使sudo不需要密码
    磁盘挂载
    github/gitlab添加多个ssh key
    生成SSH key
    git 删除追踪状态
    angular2+ 初理解
    本地项目上传到GitHub
    new Date()之参数传递
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6772503.html
Copyright © 2011-2022 走看看