合唱队形

hudu1 2007-06-12 03:48:04
N位同学站成一排,音乐老师要求N-K个同学出列,使得剩下的K位同学排成合唱队形.
合唱队形是指这样一种对形:设K位同学从左到右依次编号为1,2....,k,他们的身高分别为T1,T2,T3...,TK,则他们的身高满足T1<...< Ti >Ti+1>..>TK(1<=i<=K).
我们的任务是,已知所以N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形.
样例输入:
186 186 150 200 160 130 197 220
样例输出:
4
说明:该样例中,可以要队头身高186的两个人出列,以及队尾197和220的人出列,共4人出列,所以输出4.
谢谢大家了
...全文
4661 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luffyke 2008-11-19
  • 打赏
  • 举报
回复


#include "stdio.h"


void main()
{
int i,j,n,height[101],a,b[101],c[101],max=0;
while((scanf("%d",&n)!=EOF&&n!=0))
{

for(i=0;i<n;i++){
scanf("%d ",&height[i]);
//b[i]=1;
//c[i]=1;
}
for(i=0;i<n;i++){
b[i]=1;
for(j=0;j<i;j++){
if(height[i]>height[j]&&b[i]<b[j]+1)
b[i]=b[j]+1;
}
}
for(i=n-1;i>=0;i--){
c[i]=1;
for(j=i+1;j<n;j++){
if(height[i]>height[j]&&c[i]<c[j]+1)
c[i]=c[j]+1;
}
}
for(i=0;i<n;i++){
if(b[i]+c[i]>max){
max=b[i]+c[i];
a=n-max+1;
}
}
printf("%d\n",a);


}
}

hudu1 2007-06-15
  • 打赏
  • 举报
回复
还是看不懂哦``.能详细点吗
谢谢``
csdn5211 2007-06-13
  • 打赏
  • 举报
回复
单调子序列应该是一定要求的。
fflush 2007-06-13
  • 打赏
  • 举报
回复
使用处理单调递增子序列(Longest-Monotonically-Sequence) 的算法,可以达到O(nlogn)的时间复杂度,不过实现起来会有点复杂
csdn5211 2007-06-13
  • 打赏
  • 举报
回复
楼上,你怎么保证最少呢?
hailongchang 2007-06-13
  • 打赏
  • 举报
回复
上面忘了写了:每次循环完以后i++,j--;
hailongchang 2007-06-13
  • 打赏
  • 举报
回复
把这n个同学放入一个数组a,然后用i 和j分别从数组的头和尾遍历数组,设共有x+y位同学出列。

while(j>=i)
{
if(a[i]>=a[i+1])
{
if(i!=0)
{
int t = 0;
x=0;
while(t<=i)
{
if(a[t]>=a[i+1])
x++;
}
}
else
x++;
}
if(a[j]<=a[j-1])
{
if(j!=length(a)-1)
{
int t = lenght(a)-1;
y=0;
while(t>=i)
{
if(a[j]<=a[j-1])
y++;
}
}
else
y++;
}

}


算法的思想其实就是:

如果a[i]>=a[i+1],那么如果是i=0的情况,则x++,如果不是,因为存在这样一种可能(4,10,3),因为前面的所有元素都有可能大于a[i+1],所以重新设置x =0,t=0,从头开始遍历数组,如果发现a[t]>=a[i+1],则x++.

从数组尾部遍历数组的情况是一样的

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧