1. 程式人生 > >L2-014. 列車調度

L2-014. 列車調度

二分 HR pre sca none nbsp n) str turn

L2-014. 列車調度

這是一道比較有意思的題。思路很簡單,重點在於做好優化。

解題思路: 通過軌道進行調度,想要讓車按照序號降序開出,問你最少需要多少軌道。 首先我們知道要想讓車按照降序開出的話,每個在軌道上車的序號都要小於同軌道前面車的序號。 那麽我們,每讀取一輛車的序號,都要拿著該序號和所有軌道上最後一輛車的序號去比,只有該車序號小於某軌道上最後一輛車的序號,才能把該車停到該軌道上。 最適合停靠的是最後一輛車的序號和該車序號差值最小的軌道。 如果沒有任何一條可以滿足停該車條件的軌道,就要多創建一條軌道。 我們可以貪心一下,只要該車能停進現有的任何一個軌道,就不為其創建新的軌道。

思路有了接下來就是優化的問題了。 開數組a[100010],a[i]保存第i+1軌道上停的最後一輛車的id(序號)。 我們可以發現,當我們創建新軌道時都是由於之前每一條軌道上的最後一輛車的序號都小於你要停的車的序號。 意味著 其滿足 a[i+1]>a[i]; 所以讀入每個車的id。都先拿該id和a[n-1]比較。如果大於它,那麽現有的任何軌道都不滿足該車的停靠條件。 如果小於它,根據a[i+1]>a[i],我們可以通過二分查找,確定最適合停靠的軌道。

技術分享圖片
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;

const int MAX=1e5+10;

int a[MAX];

void updata(int x,int l,int r)
{
    if(l==r)
    {
        a[l]=x;
        return;
    }
    int mid=(l+r)/2;
    if(a[mid]>x)
    {
        updata(x,l,mid);
    }
    
else { updata(x,mid+1,r); } } int main() { int T,n,x; scanf("%d",&T); n=0; while(T--) { scanf("%d",&x); if(n==0) a[n++]=x; else if(x>a[n-1]) { a[n++]=x; } else { updata(x,
0,n-1); } } printf("%d\n",n); return 0; }
View Code

 

L2-014. 列車調度