海大同学小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到,马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。
输入描述:
首先一个正整数N,表示人员个数。之后N行,每行三个数,分别对应马戏团员编号,体重和身高。
输出描述:
正整数m,表示罗汉塔的高度。
好的学渣没有屏障,好的互联网不要搞信息差
c语言程序设计实践小学期不同老师要求不一样,不同班级题目不一样。我当时小学期任务是独自处理完成三道题目,现为其一——罗汉塔问题。
代码部分借鉴网络,部分个人书写,已标好备注。
//残存部分废弃代码,但已被注释。
代码可优化的地方,1.功能函数模块化 2.减少全局变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//对于本题的理解是,身高体重相等可以叠罗汉,体重不等(满足X层比X+1层重)身高等可以叠罗汉,身高体重都满足条件可以叠罗汉
//是两个维度严格递增问题
//且每层罗汉只有一人
//以此理解编写的程序
//程序编写过程中查阅了最长递增子序列,一维、二维动态数组定义,局部冒泡法等资料
//并无抄袭,根据自己的想法进行的程序编写
//水平太菜,没办法做到模块化,因此全部功能都包含在main函数。
//定义了很多全局变量,如下
int N,i,j,t,k,max;//静态指针、struct结构体、全局变量等可返回多个值
//不知道为什么有些变量在主函数里面定义会不断报错,找不出原因,最后致使定义了超级多的全局变量
int main()
{
int **p,*list;
scanf("%d",&N);//输入行数
if(N<=0)return -1;//非法输入将立刻终止程序,此处还可以进行改进,换成循环,但这里不再处理
list=(int *)malloc(N*sizeof(int));
for(i=0;i<N;i++)
{
list[i]=0;
}//创建一个和p同等长度的一维数组,并初始化
p=(int **)malloc(N*sizeof(int*));//数组p的每个元素都指向int类型指针的指针,每个指针指向一行,共N行
for(i=0;i<N;i++)
{
p[i]=malloc(sizeof(int)*3);//为每行申请数据空间
}
for(i=0;i<N;i++)
{
scanf("%d%d%d",&p[i][j],&p[i][j+1],&p[i][j+2]);//输入数据
}
//对身高的冒泡排序,让小的数据上浮
for (k=0; k<N-1;k++)//排N-1次
{
for (i=0; i<N-1-k;i++)//每一轮比较N-1-k次
{
if (p[i+1][2]<p[i][2])
{
for (j=0;j<3;j++)//整行元素交换
{
t=p[i+1][j];
p[i+1][j]=p[i][j];
p[i][j]=t;
}
}
}
}
for(i=0;i<N;i++)
{
for(j=0;j<3;j++)
{
printf("%d",p[i][j]);
printf("\n");
}
}//检查数组是否排序
//身高相同排序——局部冒泡排序
for(i=0;i<N-1;i++)
{
if (p[i+1][2]==p[i][2])
{
goto sort;
}
sort:
if (p[i+1][1]>p[i][1])
{
for(j=0;j<3;j++)
{
t=p[i+1][j];
p[i+1][j]=p[i][j];
p[i][j]=t;
}
}
for(i=i+1;i<N-1;i++)
{
if (p[i+1][2]==p[i][2])
{
goto sort;
}
if (i=N)break;
}
}
for(i=0;i<N;i++)
{
int j=0;
printf("%d%d%d",p[i][j],p[i][j+1],p[i][j+2]);
printf("\n");
}//检查数组是否排序
list[0]=1;
for(i=0;i<N;i++)
{
max=0;
for(j=0;j<i;j++)
if((p[i][1]>p[j][1])&&(max<list[j]))
{
max=list[j];
}
list[i]=max+1;
}
for(i=0;i<N;i++)
{
printf("%d",list[i]);
}
max=0;
for(i=0;i<N;i++)
{
if(list[i]>list[max])
{
max=i;
}
}
printf("最高罗汉塔层数为:%d",list[max]);
/*for (i=0;i<N;i++)//A:"以体重最大者为底层,进行遍历计数;再以体重次之者为底层,进行遍历计数。以此类推。"
{
int h=0;
int m=1;//每次A循环开始,都会将m值重新初始化为1
for (k=1;k<N-1;k++)//B:此为以第i层为底层时,罗汉塔只能有1层时的判定
{
if (p[i+k][2]<=p[i][2])
{
h=h+1;
printf("罗汉塔层数大于一");
break;
}
while (p[i+k][2]>p[i][2])
{
continue;//当不存在p[i+k][2]<=p[i][2]时,while循环被打破,进行下一轮D循环
}
}
if (h=0)continue;//体重已经排完序,下面排除身高顺序不符合的
}废案*/
/*SORT:
for(k=0;k<N;k++)
{
if(p[i+k][2]<=p[i][2])//错误尝试,大概率不是最优解
{
m=m+1;
i=i+k;
goto SORT;
}*/
for(i=0;i<N;i++)
free(p[i]);
free(p);//释放内存
free(list);
}