はじめに
競技プログラミングについての質問ですが、paizaやある企業のコーディングテストに関連するものではありません。
問題概要
数直線状に(start_i, end_i)がいくつか与えられます。
区間スケジューリングでは、仕事の数を最大にする問題ですが、今回は重なっている区間の重なりの最大値を算出したいです。
自分のコード
vp[i].firstにその区間のstart地点
vp[i].secondにその区間のend地点を入れています。
c++
1 vector<pair<int, int>> vp; 2 int ans = 0; 3 for (int i = 0; i<vp.size(); i++){ 4 int cnt = 0; 5 int sx = vp[i].first; 6 int ex = vp[i].second; 7 for (int j=0; j<vp.size(); j++){ 8 if((vp[j].first <= sx && vp[j].second >= sx) || (vp[j].first <= ex && vp[j].second >= ex) || (sx <= vp[j].first && ex >= vp[j].second) || (sx >= vp[j].first && ex <= vp[j].second)){ 9 sx = max(sx, vp[j].first); 10 ex = min(ex, vp[j].second); 11 cnt++; 12 } 13 } 14 ans = max(ans, cnt); 15 }
質問
このアルゴリズムは計算量で言えば$0(N^2)$となっています。
そもそも、このアルゴリズムは正しいのでしょうか? (一応自分のテストケースをいくつか作ったものではうまくいっているのですが確信はありません)
正しい場合、もっと効率よくできたりしないでしょうか?
[追記]atcoderm leetcode, aojなどで関連問題があれば、教えて欲しいです
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。