zoukankan      html  css  js  c++  java
  • 算法与数据结构5.1 Just Sort

    ★实验任务

    给定两个序列 a b,序列 a 原先是一个单调递增的正数序列,但是由于某些 原因,使得序列乱序了,并且一些数丢失了(用 0 表示)。经过数据恢复后,找 到了正数序列 b ,且序列 a 中 0 的个数等于序列 b 的个数,打算使用序列 b 恢 复序列 a 。
    对于序列 a 来说,我们可以交换两个位置上的非零的数,并且可以交换任意 次。序列 b 同样也可以进行任意次交换。
    现在要将序列 b 填充到序列 a 中的值丢失的位置上,序列 b 中的每个数只能 填充一次,问最后构成的序列是否是单调递增的,如果是,则输出填充后的序列, 否则输出-1。

    ★数据输入

    输入给定 N M,表示序列 a 和序列 b 的长度。 第一行为序列 a ,第二行为 序列 b。 题目保证除了 0 以外的数,在序列 a 和 b 中只出现一次。
    数据保证: 80%的数据,N, M <= 100
    100%的数据,N, M <= 100000, 0 <= a[i] <= 100000, 0 < b[i] <= 100000

    ★数据输出

    如果最后序列 a 是单调递增的,输出该序列,否则输出-1。

    输入示例 输出示例
    4 2
    0 11 0 15
    1 12
    1 11 12 15

    输入示例 输出示例
    4 2
    0 0 11 15
    1 12
    -1

    思路

    将第一次输入的序列中的非零数取出来存入数组b,并将位置标记为-1,将取出的数组b和后输入的序列排序后,按照标记(0和-1)填入数组,判断是否递增即可。


    但是这道题我得到了十个SO,原因是在main函数里开了3个100000的数组导致。

    Code

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    int partition(int *arr,int l,int r);
    void swap(int &x,int &y)
    {
    	int temp;
    	temp=x;
    	x=y;
    	y=temp;
    }
    void quicksort(int *arr,int l,int r)
    {
    	int i;
    	if(l>=r)return;
    	i=partition(arr,l,r);                 //找到中间数 
    //	cout<<i<<endl;
    	quicksort(arr,l,i-1);                 //对左半边排序 
    	quicksort(arr,i+1,r);                 //对右半边排序 
    }
    int partition(int *arr,int l,int r)
    {
    	int v=l;
    	int x=arr[v];
    	int i=l;
    	int j=r+1;
    	while(1)
    	{
    		while(i+1<=r)
    		{
    			if(arr[i+1]<x)
    			{
    				i++;
    			}
    			else
    			{
    				i++;
    				break;
    			}
    		}
    		while(j-1>=l)
    		{
    			if(arr[j-1]>x)
    			{
    				j--;
    			}
    			else
    			{
    				j--;
    				break;
    			}
    		}
    		if(i>=j)break;
    		swap(arr[i],arr[j]);
    	}
    	swap(arr[v],arr[j]);
    	return j;
    }
    int main()
    {
    	int a[100001],b[100001],c[100001];
    	int m,n,i,j,flag=0;
    	scanf("%d %d",&m,&n);
    	for(i=0,j=0;i<m;i++)
    	{
    		scanf("%d",&a[i]);
    		if(a[i]!=0)
    		{
    			b[j++]=a[i];
    			a[i]=-1;
    		}
    	}
    //	for(i=0;i<m;i++)
    //			printf("%d",a[i]);	
    //	printf("
    ");
    //	for(i=0;i<j;i++)
    //			printf("%d",b[i]);	
    //	printf("
    ");
    	for(i=0;i<n;i++)
    		scanf("%d",&c[i]);
    	quicksort(b,0,j-1);
    	quicksort(c,0,n-1);
    //	for(i=0;i<j;i++)
    //			printf("%d ",b[i]);	
    //	printf("
    ");
    //	for(i=0;i<n;i++)
    //			printf("%d ",c[i]);	
    //	printf("
    ");
    	int x=0,y=0;
    	for(i=0;i<m;i++)
    	{
    		if(a[i]==0)
    		{
    			a[i]=c[x++];
    		}
    		else
    		{
    			a[i]=b[y++];
    		}
    	}
    //	for(i=0;i<m;i++)
    //			printf("%d ",a[i]);
    //	printf("
    ");
    	for(i=0;i<m-1;i++)
    	{
    		if(a[i]>a[i+1])
    		{
    			flag=1;
    			break;
    		}
    	}
    	if(flag)
    	{
    		printf("-1");
    	}
    	else
    	{
    		for(i=0;i<m;i++)
    			printf("%d ",a[i]);
    	}
    	return 0;
    }
            
    
  • 相关阅读:
    函数的内置方法
    函数
    文件操作
    三元运算
    流程控制
    集合
    div容器内文本对齐--神奇的css
    Struts2的零配置和rest插件
    MIME类型
    ganymed-ssh2使用
  • 原文地址:https://www.cnblogs.com/031602523liu/p/7740226.html
Copyright © 2011-2022 走看看