中石油oj 2654: 序列合并

参照别人的思路自己写的代码。(代码量很大也不够优化。)

#include <iostream>
#include <cstring>
using namespace std;
const int inf=1e5+10;
int arr1[inf],arr2[inf],ans[inf];
int n;                    //使用结构体。 
struct node
{
    int a;
    int b;
};
node temp[inf]; 

void bigstack(int i)    //小根堆。i是第i个。 
{    
    while(i!=1)
    {
        if(temp[i].a<temp[i/2].a)
            swap(temp[i],temp[i/2]);
        else
            break;
        i=i/2;
    }
}
void stacksort()
{
    int i=1;
    while(i*2+1 <=n )             //这里是关键,只能够进行考虑最后一个。也是不同的。完全是可以进行改进的。 
    { 
        if(temp[i*2+1].a<temp[i*2].a&&temp[i].a>=temp[i*2+1].a)
        {
            swap(temp[i],temp[i*2+1]);
            i=i*2+1;        
        }    
        else if(temp[i*2].a<=temp[i*2+1].a&&temp[i].a>=temp[i*2].a)
        {
            swap(temp[i],temp[i*2]);
            i=i*2;
        }
        else                    //分布,先是从两个进行考虑,之后在加条件罢了。 
            break;            
    } 
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&arr1[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&arr2[i]);
        for(int i=1;i<=n;i++)
        {
            temp[i].a=arr1[i]+arr2[1];
            temp[i].b=i;
        }
        for(int i=2;i<=n;i++)   
            bigstack(i);  ///调用函数。
        //之后。
        int flag[inf];    //flag[i]代表的是第i个的指向。 
        for(int i=1;i<=n;i++)
            flag[i]=1;    //指向的是第一个。                             
        //因为是任意的一个是不好进行判定的,所以只能是结构体,结束的时候在看一下。 
        for(int i=1;i<=n;i++)    //但是也是要进行记录的。看来要是结构体。 
        {
            ans[i]=temp[1].a;     //就是寻找最为简单的一条路,时空效率最为简单的一条路,并且要代码量也是要最少的。 
            flag[temp[1].b]++;    //值是第几个,代表的死arr2【】,temp【i】.b应该是第几个的角标吧。 
            temp[1].a = arr1[ temp[1].b ]+arr2[ flag[temp[1].b] ];
            stacksort();                             
        } 
        cout<<ans[1];
        for(int i=2;i<=n;i++)
            cout<<" "<<ans[i];
        cout<<endl;
    }    
    return 0;    

猜你喜欢

转载自blog.csdn.net/weixin_40799464/article/details/81842751