华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2883|回复: 8
打印 上一主题 下一主题

NOIP2004提高组题3 合唱队形

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2014-10-21 16:46:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
三、合唱队形

(chorus.pas
/dprccpp)

【问题描述】

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

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

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

【输入文件】

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

【输出文件】

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

【样例输入】

8
186 186 150 200 160 130 197 220

【样例输出】

4

【数据规模】

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


回复

使用道具 举报

3

主题

9

帖子

87

积分

注册会员

Rank: 2

积分
87
沙发
发表于 2014-10-28 20:18:23 | 只看该作者
效率不太高的方法:
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,t[101],a[101]={0},k=0,kf=0;
  5. bool down(int);
  6. int next(int i)
  7. {
  8.     int ii=i;
  9.     do
  10.     {
  11.         i++;
  12.         if(i>n)return ii;
  13.     }while(a[i]==0);
  14.     return i;
  15. }
  16. void save()
  17. {
  18.     kf=kf<k?k:kf;
  19. }
  20. void mysearch(int p)
  21. {
  22.     if((p>n)&&(down(p)))
  23.     {
  24.         save();
  25.     }
  26.     else for(int i=p;i<=n;i++)
  27.     {
  28.         if(a[i]==0)
  29.         {
  30.             k++;
  31.             a[i]=1;
  32.             if(down(i))
  33.                 mysearch(p+1);
  34.             a[i]=0;
  35.             k--;
  36.             if(down(i))
  37.                 mysearch(p+1);
  38.         }
  39.     }
  40. }
  41. int main()
  42. {

  43.     cin>>n;
  44.     for(int i=1;i<=n;i++)
  45.         cin>>t[i];
  46.     mysearch(1);
  47.     cout<<n-kf;
  48.     return 0;
  49. }
  50. bool down(int p)
  51. {
  52.     bool b=true;
  53.     int mx=1,i;
  54.     while((mx<p)&&(t[mx]<t[next(mx)]))mx++;
  55.     for(i=mx;i<p;i++)
  56.         if((a[i]==1)&&(t[i]<=t[next(i)])&&(i!=next(i)))b=false;
  57.     return b;
  58. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

68

帖子

1592

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1592
板凳
发表于 2014-10-28 21:47:05 | 只看该作者
Settwarl 发表于 2014-10-28 20:18
效率不太高的方法:

膜拜大神,我完全不知道怎么写
这个人很懒,不想写签名。
回复 支持 反对

使用道具 举报

2

主题

17

帖子

143

积分

注册会员

Rank: 2

积分
143
QQ
地板
发表于 2014-11-4 21:42:32 | 只看该作者
这是我的做法:n个最长上升子序列和最长下降子序列。。。并上并行读取。。。
  1. #include<iostream>
  2. using namespace std;
  3. int n,a[10010],ans1[10010],ans2[10010],ans[10010],k=9999999;
  4. int main()
  5. {
  6.         cin>>n;
  7.         for(int i=1;i<=n;i++)
  8.         {
  9.                 cin>>a[i];
  10.                 for(int j=1;j<=i;j++)
  11.                 if(a[i]>a[j])ans1[i]=max(ans1[i],ans1[j]+1);
  12.         }
  13.         for(int i=n;i>=1;i--)
  14.         for(int j=n;j>=i;j--)
  15.         if(a[i]>a[j])ans2[i]=max(ans2[i],ans2[j]+1);
  16.         for(int i=1;i<=n;i++)
  17.         {
  18.                 ans[i]=ans1[i]+ans2[i];
  19.                 k=min(k,n-ans[i]);
  20.         }
  21.         if(k!=9999999)cout<<k-1;
  22.         return 0;
  23. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
5#
发表于 2018-9-30 18:56:51 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,a[110],f1[110],max1,f2[110],max2,ans;
  4. int i,j,k;
  5. int main()
  6. {
  7.     cin>>n;
  8.     for(i=1;i<=n;i++)cin>>a[i];
  9.     for(i=1;i<=n;i++)
  10.     {
  11.         f1[i]=1;
  12.         f2[i]=1;
  13.     }
  14.     for(i=2;i<=n;i++)
  15.         for(j=1;j<=i-1;j++)
  16.             if(a[i]>a[j]) f1[i]=max(f1[i],f1[j]+1);
  17.     for(i=n-1;i>=1;i--)
  18.         for(j=n;j>=i+1;j--)
  19.             if(a[i]>a[j]) f2[i]=max(f2[i],f2[j]+1);
  20.     for(i=1;i<=n;i++)
  21.       ans=max(ans,f1[i]+f2[i]-1);
  22.     ///cout<<ans<<endl;
  23.     cout<<(n-ans);
  24. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 04:29 , Processed in 0.116709 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表