【解题思路】
① 由于新生的身高先输入,目前合唱队的身高也是有序、依次输入的,就没必要用数组记录每一位同学的身高之后再进行查找对比了,在输入合唱队身高数据的过程中就能直接处理。
② 根据题意,无非是出现3种情况:① 排左边;② 排右边;③ 排最高。题目没有说明新生如果和某一合唱队的同学身高相等的时候应该排他左边还是右边,所以只能默认输入的数据不会出现这种情况。
③ 代码原理很简单,当输入的数据是合唱队左边那排同学的身高时,记录新生【排左边】的位置;当输入的数据是合唱队右边那排同学的身高时,记录新生【排右边】的位置;在合唱队同学最高的身高数据出现时,记录新生【排最高】的位置。最后,当输入老师希望他站在哪一侧,也就是输入最后一个数据时,直接输出对应的结果就可以了。
【注意事项】
① 判断当前输入的身高数据属于哪一边很关键,用max记录下合唱队身高的最大值,若输入的数据比max大,说明正在输入递增的数据,也就是左边的数据;若输入的数据比max小,说明正在输入递减的数据,也就是右边的数据。
② 在输入合唱队身高数据的同时要记录3个位置(左、右、最高),分别记录了一次之后便不再记录,加判断条件避免重复覆盖记录。
【参考代码】
#include<stdio.h> int main(void) { int n,m,a,i=1,MAX=-1,L=-1,R=-1; // MAX记录最大身高,L记录排左边的位置,R记录排右边的位置 scanf("%d%d",&n,&m); while(n--) // 输入n个身高 { scanf("%d",&a); if(a>MAX) // 如果输入的身高比MAX大,说明现在还是在输入左排人员的身高 { MAX=a; // 更新MAX if(m<a&&L==-1) // 如果m比现在输入的身高要小,记录排左边的位置L L=i; } else // 如果输入的身高比MAX小,说明现在开始在输入右排人员的身高 { if(m>MAX&&R==-1) // 这时候最大身高MAX不会再变了,判断m是否超过MAX并记录位置 L=R=i; if(m>a&&R==-1) // 如果m比现在输入的身高要大,记录排右边的位置R R=i; } i++; } if(R==-1) // 如果直到最后也没有记录排右边的位置R,说明位置R在最后一个 R=i; scanf("%d",&a); if(a==1) // 输入老师想排哪边,输出排那边的位置即可 printf("%d",L); else printf("%d",R); return 0; }
0.0分
2 人评分