中石油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;?? ?
}?
總結
以上是生活随笔為你收集整理的中石油oj 2654: 序列合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堆排序(二分)
- 下一篇: Skyscraper