0
0

More than 1 year has passed since last update.

区間選択アルゴリズム

Last updated at Posted at 2022-02-15

何を書いているか

区間選択アルゴリズムの備忘録。
C++とGoで記述。
プログラミングスキルチェックの問題で選択アルゴリズムを使って解く問題に出会ったので。

コード

ここでは終わりと次の始まりがつながらない区間を選択するパターン。
つながった場合も選択可能とする場合はコードの示した箇所を等比較にすればよい。

C++版

#include <bits/stdc++.h>
using namespace std;
int main() {
    // cin.tie(0);
    // ios::sync_with_stdio(false);

    int N;
    cin >> N;
    vector<int> X(N), L(N);
    for (int i = 0; i < N; i++) {
        cin >> X.at(i) >> L.at(i);
    }

    vector<pair<int, int>> p(N);
    for (int i = 0; i < N; i++) {
        p[i].first = X[i] + L[i]; // 終端を先に入れておく
        p[i].second = X[i];// - L[i];
    }

    sort(p.begin(), p.end()); // 終端を優先にソート

    int ans = 1;
    int t = p[0].first; // t:=現在までに選択した区間の中で一番後ろの点
    for (int i = 1; i < N; i++) {
        if (t < p[i].second) { //ここを等記号にすれば区間がつながっていてもOKとする。
            ans++;
            t = p[i].first;
        }
    }

    cout << ans << endl;

    return 0;
}

Go版

package main
import (
    "fmt"
    "sort"
    )

type Pair struct {
    start int
    length int
    end int
}
func main(){
    var N int
    fmt.Scan(&N)

    kukan:=make([]Pair,0)
    for i:=0;i<N;i++ {
        var start,length int
        fmt.Scan(&start)
        fmt.Scan(&length)
        kukan=append(kukan, Pair{start, length, start+length})
    }

    sort.Slice(kukan, func(i, j int) bool { return kukan[i].end < kukan[j].end })

    ans:= 1;
    t:= kukan[0].end; // t:=現在までに選択した区間の中で一番後ろの点
    for i:=1;i<N;i++ {
        if (t < kukan[i].start) {
            ans++
            t=kukan[i].end
        }
    }

    fmt.Println(ans)
}
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0