HDU 2019 C++数列有序!!!

							数列有序!

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 152555 Accepted Submission(s): 62085

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

今天这道题我要好好的讲一下!

这道题有没有同学是用的数组整体往后移的算法呢?
整体往后移没有问题!但是用的是二重循环耶!

假如我输入的n为99,插入的m值在第二位咋办?
例如:
99 2
1 3 4 5 6 7 8 9…100
难道要把后面的98位数字在数组中整体往后移吗?我想想都可怕呀!!

那时间复杂度也太长啦吧!

有没有更简洁的做法呢???
答案是有的

那就是按照题目的条件来输出呀!
具体怎么做!看代码

#include<iostream>
using namespace std;
int main()
{
	int n,m;
	while(cin>>n>>m&&(n||m))
	{
		int a[105];//为了避免数组越界,大于等于101即可
		int i=0;
		while(n--)
		{
			int temp;
			cin>>temp;
			a[i++]=temp;
		}
		
		int j,count=0;
		//count的作用就是标记
		//有三种情况
		//1,插入的数在最前面
		//2,插入的数在中间
		//3,插入的数在末尾
		for(j=0;j<i;j++)
		{
			if(a[j]>m&&count==0)
//为了防止插入过后继续插入m值(因为后面的有序数都是大于m的),故增加一个count作为一个限制条件,保证m只在某有序数(该数大于m)前且只插入一次

			{
				count++;
				cout<<m<<" ";
				j--;//如果m不在末尾插入,这里一定要减一个1
			}
			else
			{
				if(j==i-1&&count!=0)//这里主要是为了保证格式正确
					cout<<a[j]<<endl;
				else
					cout<<a[j]<<" ";
			}
		}
		if(count==0)//count的另一作用是保证如果m插在末尾的话,要保证格式正确,即最后一个数字后面不得有空格!
			cout<<m<<endl;
	}
	return 0;
}
				

综上所述,总体思想是不需要动用数组的插入算法来大费周折
我保证输出的时候是按照有序数输出即可!
最终我AC掉这道题!太开心啦!

总所周知,数组适合查找,不适合插入和删除!
所以如果要数组大量的往后移!一般应该是不可取的!!!

如果你有更好的办法,欢迎在下方留言呀!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值