hdu 2019 数列有序!(c语言)

版权声明:本文为博主原创,未经博主允许不得转载 https://blog.csdn.net/Sherry_Yue/article/details/84526987

hdu 2019 数列有序!

点击做题网站链接

题目描述

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。

Output
对于每个测试实例,输出插入新的元素后的数列。

Sample Input
3 3
1 2 4
0 0

Sample Output
1 2 3 4

题目难点

1. 如何寻找插入点

问题解答

#include <stdio.h>
int main()
{
    int n,m,a[102];
    while( scanf("%d%d",&n,&m)!=EOF && m!=0 && n!=0 )
    {
        /*录入数组*/
        for(int i=0;i<n;++i)
            scanf("%d",&a[i]);

        if( m<a[0] )//如果m小于第一个元素
        {
            for(int i=n-1;i>=0;--i)
                a[i+1]=a[i];//所有元素都后移
            a[0]=m;//把m覆盖第一个元素
        }

        if( m>a[n-1] )//如果m大于最后一个元素
            a[n]=m;//m就插在数列末尾

        if( m>=a[0] && m<=a[n-1] )//最后剩下的一种情况
        {
            for(int i=n-1;i>=0;--i)//从数组的最后一个元素来往前遍历
                if( m>=a[i] )//找到下标i为插入点的前一个元素的下标
                {
                    for(int j=n-1;j>i;--j)//把下标为i数组元素后面的所有元素都后移
                        a[j+1]=a[j];
                    a[i+1]=m;//插入m
                    break;//跳出循环,因为下标为i的元素前面所有的元素都符合m>=a[i],继续循环下去会出问题
                }
        }
        
		/*打印数组元素*/
        printf("%d",a[0]);
        for(int i=1;i<=n;++i)
            printf(" %d",a[i]);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Sherry_Yue/article/details/84526987