Time Limit: 3 second
Memory Limit: 2 MB

将一个数x插入到有序数列a中,插入后a仍然有序。

Input

第一行输入有序数列a的元素个数
第二行依次输入a的元素,以回车结束
第三行输入x的值

Output

输出插入x后的数列,每个元素用空格隔开,最后用回车结束

Sample Input

10
1 2 11 13 15 20 25 30 35 40
21

Sample Output

1 2 11 13 15 20 21 25 30 35 40

【题解】

这个插入要特别注意 小于最小值和大于最大值的情况。特判是比较明智的选择。。其他的只要for一遍

找到一个I 使得a[i] <= temp temp <= a[i+1]就好。然后从n+1开始for 到 i+2,a[j]=a[j-1];这样就能全部往后移一位。

【代码】

#include <cstdio>
#include <stdlib.h>

const int MAXN = 30000;

int n,temp,a[MAXN];

void output_ans() //把输出答案的步骤做成一个过程,方便特判。
{
    for (int i = 1;i <= n;i++)
        printf("%d ",a[i]);
    printf("%d\n",a[n+1]);
}

void input_data()
{
    scanf("%d",&n);
    for (int i = 1;i <=n ;i++)
        scanf("%d",&a[i]);
    scanf("%d",&temp);
    if (temp > a[n]) //特判两种情况,即小于最小值和大于最大值的情况
        {
            a[n+1] = temp;
            output_ans();
            exit(0);
        }
    if (temp < a[1])
        {
            for (int j = n+1;j >= 2;j--)
                a[j] = a[j-1];
            a[1] = temp;
            output_ans();
            exit(0);
        }
}

void get_ans()
{
    int j;
    for (int i = 1;i <= n-1;i++) //这是判断插入的位置。寻找到题解所需要的i
        if (a[i] <= temp && temp <= a[i+1])
            {
                j = i;
                break;
            }
    for (int k = n+1;k >= j + 2;k--) //这是将所有的数字往后移动一位的方法。
        a[k] = a[k-1];
    a[j+1] = temp;
}

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    input_data();
    get_ans();
    output_ans();
    return 0;
}