【解题思路】
① 面对复杂多样的排序要求,可以尽量转化为单一的判断条件来进行求解;
② 题目中影响看病优先级的因素一共就两个:年龄和登记顺序,年龄的权重明显比登记顺序要高;
③ 假设 S 为看病的优先级,S越大,优先级越高,也就越先看病。
【1】非老年人按登记的先后顺序看病
① 根据题目输入数据限制,看病的人数不到100人,也就是说看病的顺序 i 可用1-99的整数来表示;
② 转换成优先级S就是:S=100-i,因为优先级是越大越先看病的,所以要反过来;
③ 如上图所示,蓝色为年龄(目前暂未考虑),橙色为登记顺序i,绿色部分则为优先级S与登记顺序i的关系;
④ 当然此思路仅针对本题的限制条件,若看病的人有1000个、10000个、不限个数等情况就不适合用此方法。
【2】老年人(年龄 >= 60岁)比非老年人优先看病
① 也就是说60岁及以上的人无论登记顺序怎么样,都比60岁以下的人的优先级S要大;
② 假设病人的年龄为 j ,那么年龄的权重 j 一定要比登记顺序的权重 i 要大,且不能被 i 影响;
③ 其实直接让60岁及以上的人的优先级超过100即可,因为登记顺序的优先级S=100-i是不可能超过100的。
【3】老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序
① 结合第【2】点,当年龄大于等于60岁时,优先级设置为 S=j*100+100-i 即可,j是病人年龄,i是登记顺序;
② 结合第【1】点,当年龄小于60岁时,S=100-i ,因为年龄不是影响看病顺序的因素;
③ 如上图所示,即使两老人的年龄一样,也可以通过登记顺序的不同来排序看病顺序;
④ S的算法并不唯一,也并不适用于其他特殊情况,比如年龄数据输入了个很大的数,再乘以100直接超数据范围了等等。
【注意事项】
① 注意题目给出的测试数据范围;
② 排序做数据交换时,优先级数和病人的ID要一起交换。
【参考代码】
#include<stdio.h> int main(void) { char a[101][10]; // a[i]存放病人ID int b[101][2],n,c; // b[i][0]存放病人ID的数组下标,b[i][1]存放病人的优先级 scanf("%d",&n); for(int i=1;i<=n;i++) { b[i][0]=i; scanf("%s%d",a[i],&b[i][1]); b[i][1]=b[i][1]>=60?b[i][1]*100+100-i:100-i; // 判断60岁以上和以下的情况 } for(int i=1;i<=n;i++) // 用优先级数从大到小排序 { for(int j=i+1;j<=n;j++) if(b[j][1]>b[i][1]) { c=b[j][0];b[j][0]=b[i][0];b[i][0]=c; // 交换b[j][0]和b[i][0] c=b[j][1];b[j][1]=b[i][1];b[i][1]=c; // 交换b[j][1]和b[i][1] } printf("%s\n",a[b[i][0]]); // 输出排完序的病人ID } return 0; }
0.0分
7 人评分