C语言高手请教:合唱队形算法

来源:百度知道 编辑:UC知道 时间:2024/05/10 02:08:49
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

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

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

Input

输入包含若干个测试用例。
对于每个测试用例,输入第一行是一个整数N(2<=N<=100),表示同学的总数。第二行有N个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。当输入同学总数N为0时表示输入结束。

Output

对于每个测试案例,输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

Sample Input

8
186 186 150 200 160 130 197 220
3
150 130 140
0

Sample Output

4
1
顺序不能调换,第二组150 130 140,只能去掉150后才能组成合唱队形,顺序不能调换的

补充之后就懂了~~呵呵。这个程序TC下测试成功,好累,懒得写注释了,有时间了给你解释。先贴出来,你copy到TC里面可以直接用,没有人机交互,例如提示输入n之类的,你就按顺序先输入n在输入身高就好了,不过身高输入的时候一定要3位一空格,也就是就算只有50厘米也要输入050再空格。后来自己又考虑了一下,算法还是有缺陷,晚上我再想。困了。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,test[100],len,k,flag;
char *read=malloc(512*sizeof(char));
do{
k=0;
for(len=0;len<100;len++)
test[len]=0;
flag=1;
scanf("%d\n",&n);
if(n<2||n>100)
exit(0);
if(n!=0)
fgets(read,512,stdin);
len=strlen(read)-1;
read[len]='\0';
for(len=0;len<n;len++){
test[len]=atoi(read);
read+=4;
}
for(len=0;len<n;len++){
if(test[len]<test[len+1]){
flag=0;
continue;
}
else{
if(flag)
k+=1;
else
break;
}
}