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("
");
}
return 0;
}