DotcppXF


私信TA

用户名:dotcpp0599925

访问量:5059

签 名:

层楼终究误少年

等  级
排  名 199
经  验 6540
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业 计算机科学与技术

  自我简介:

The sad truth is, not everyone will accomplish something great. Some of us may just have to find meaning in the little moments that make up life.


【解题思路】


        ① 面对复杂多样的排序要求,可以尽量转化为单一的判断条件来进行求解;

        ② 题目中影响看病优先级的因素一共就两个:年龄和登记顺序,年龄的权重明显比登记顺序要高;

        ③ 假设 S 为看病的优先级,S越大,优先级越高,也就越先看病。



【1】非老年人按登记的先后顺序看病


        ① 根据题目输入数据限制,看病的人数不到100人,也就是说看病的顺序 i 可用1-99的整数来表示;

        ② 转换成优先级S就是:S=100-i,因为优先级是越大越先看病的,所以要反过来;


        1664616979141782.png


        ③ 如上图所示,蓝色为年龄(目前暂未考虑),橙色为登记顺序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 ,因为年龄不是影响看病顺序的因素;


        1664625508921125.png


        ③ 如上图所示,即使两老人的年龄一样,也可以通过登记顺序的不同来排序看病顺序;

        ④ 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 人评分

  评论区

  • «
  • »