羅区P3076 [USACO13FEB]タクシータクシー

トピック:

Mは、フェンスの長さで、n個の牛は、それぞれa_iをしてb_i、他の場所、最初と最後に車が必要。今タクシーは、すべての牛の配信を完了するために、左端の0から開始し、最後に右端M、最小必要距離に達しました。一度だけの牛を運ぶタクシー。

問題解決のアイデア:

1.各ST対応編この旅とにかく数えます

また、計算2.追加の旅は、「切り替え」コストであります

それを切り替えるためのコストは何ですか?

そこに位置に達するとSTは、ダウン投げされているためにそのような位置にあること、および家畜車のI jの中でどこ牛に運び、その先にそれを輸送し、私がアップロード編牛を戻って来ることが私たちを知っています

その後、我々は、各およびABS(ED-ST)に追加する必要があります

具体的な実装では、我々は、M ST編、出発点0の末尾に追加する必要があります

それは、EDの追加0は、STに加えmのことに留意すべきです

その理由は、私たちが最も遠い編から来たM、始点0から最も近いSTに行く必要があるということです

したがって、0は、EDの最初のバウンド対応min_st、0であり; mは、同一であります

最後にST編ソート、列挙まで追加します

A C C E P トン E D   C インクルード D E 受け入れ\コード:

#include<cstdio>
#include<algorithm>

int n, m;
int s[100005], t[100005];
long long ans;

int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d %d", &s[i], &t[i]);
        ans += abs(t[i] - s[i]);
    }
    s[n+1] = m;
    t[n+1] = 0;
    std::sort(s+1, s+n+2);
    std::sort(t+1, t+n+2);
    for (int i = 1; i <= n + 1; ++i)
        ans += abs(t[i] - s[i]);
    printf("%lld\n", ans);
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_39798042/article/details/89380777