数列有序! HDU

来源:互联网 发布:java html5 视频播放 编辑:程序博客网 时间:2024/06/04 19:18

数列有序!HDU - 2019

有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。
Output
对于每个测试实例,输出插入新的元素后的数列。
Sample Input
3 31 2 40 0
Sample Output
1 2 3 4

我自己的代码:

#include <stdio.h>int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){int s[1000];for (int i=0;i<=n;i++){scanf("%d",&s[i]);if(m<s[i]){s[i+1]=s[i];s[i]=m; printf("%d ",s[i]);i++;}else if(i==n-1){s[n]=m;printf("%d ",s[i]);i++;}if(i!=n)printf("%d ",s[i]);else printf("%d\n",s[i]);}}return 0; } 

思路比较复杂,而且对于题目中说的当n和m同时为0 时结束进程没有体现。

#当插入的数m=0,或者比第一数就小等时候,比较大小的循环并不能停止,因为是一边输入,一边比较大小,并将其插入,这样就会出现一直插入的情况。如:n=3 m=0 数为:1 2 3,输出结果就为:0 1 0 2。故这个算法有问题!


帝的算法:

思路→→比如:n=6 m=3 数为:1 2 3 4 5 6

那么先将数据输入(不像我的代码一边输入一边比较,这样对于数据的保存有影响,后面的数据极易丢失改变!),然后再比较数据和m的大小,知道m=3要插在3和4 的中间,那么先将4 5 6 都往后移动一位,也就是

1 2 3 4 5 6 

1 2 3 4 4 5 6

          这里的4因为没有进行操作所以s[3]仍然为4,这时我们只需将4用3替换即可!

记住这种思路:将数据向后移动。

int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF){        if(n==0&&m==0)            break;        int s[105];        for(int i=0;i<n;i++)            scanf("%d",&s[i]);        for(int i=0;i<n;i++)            if(m<s[i]){                for(int j=n;j>i;j--)/*这里是倒着,一直从n数到i+1,正着就不行*/
               {                    s[j]=s[j-1];                }                s[i]=m;                break;/*注意这里,如果不加break,那么每次都会比较替换。所以在第一次比较插入后,就应该停止循环,而我的代码就算加入break也不行,因为还要输入数据,无法停止循环。*/            }        for(int i=0;i<n;i++)            printf("%d ",s[i]);        printf("%d\n",s[n]);    }    return 0;}




原创粉丝点击