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 数列有序!入门的主要内容,如果未能解决你的问题,请参考以下文章