HDU2019 数列有序!入门

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2019 数列有序!入门相关的知识,希望对你有一定的参考价值。

数列有序!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 172474 Accepted Submission(s): 69813

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

Author
lcy

Source
C语言程序设计练习(三)

问题链接HDU2019 数列有序!
问题简述:(略)
问题分析
  按Markdown格式重写了题解,旧版题解参见参考链接。
  因为输入数据是有序的,也许会考虑用插入排序来做,那就有点绕远了。只要做排序就有可能可能做数据交换,程序速度就慢了。
  读入n个数据存储在数组中,再进行计算输出是可以的,浪费空间。边读入数据边计算输出结果是节省空间的解题方案。
  解法一:输入流处理
  把输入看作数据流,边读入数据边计算输出结果,可以节省空间。
  解法二:插入数据
  读入的数据存储在数组中,然后将m插入到数组的合适位置,最后输出结果。这种做法虽然浪费存储空间,也是一种可行的解题方案。
  这个做法类似于插入排序的局部处理,是常见的处理手法。
程序说明:(略)
参考链接HDU2019 数列有序!【入门】
题记:(略)

AC的C语言程序(解法一:输入流处理)如下:

/* HDU2019 数列有序! */

#include <stdio.h>

int main(void)
{
    int n, m, a, i;
    while(scanf("%d%d", &n, &m) != EOF && (n || m)) {
        if(n == 0) printf("%d\\n", m); /* n=0时,只需要输出m */
        else {
            /* 读入n个数据,同时输出数据,并且在适当位置输出m */
            int flag = 1;
            for (i = 1; i <= n; i++) {
                scanf("%d", &a);
                if (m < a && flag) {
                    if (i == 1) printf("%d", m);
                    else printf(" %d", m);
                    flag = 0;
                }

                if (i > 1 || flag == 0) printf(" ");
                printf("%d", a);
            }
            if (flag) printf(" %d", m); /* m最大 */
            printf("\\n");
        }
    }

    return 0;
}

AC的C语言程序(解法二:插入数据)如下:

/* HDU2019 数列有序! */

#include <stdio.h>

#define N 100
int a[N + 1];

int main(void)
{
    int n, m, i, j;
    while(scanf("%d%d", &n, &m) != EOF && (n || m)) {
        if(n == 0) printf("%d\\n", m); /* n=0时,只需要输出m */
        else {
            for (i = 0; i < n; i++) scanf("%d", &a[i]);

            for (i = 0; i < n; i++) if (m < a[i]) break; /* 找到插入位置 */
            for (j = n; j > i; j--) a[j] = a[j - 1]; /* 后面的数据移动一个位置 */
            a[i] = m; /* 插入m */

            /* 输出结果 */
            for (i = 0; i < n; i++)
                printf("%d ", a[i]);
            printf("%d\\n", a[n]);
        }
    }

    return 0;
}

以上是关于HDU2019 数列有序!入门的主要内容,如果未能解决你的问题,请参考以下文章

HDU2019 数列有序!

hdu 2018(母牛问题)2019(数列有序!)2020(绝对值排序 )2021(发工资)2022(海选女主角)

HDU2015 偶数求和入门

HDU2019JAVA

杭电2019 数列有序!(STL解法)

杭电ACM2019--数列有序!