[zerojudge] b966: 第 3 題 線段覆蓋長度


題目連結:


題意:
給定幾組覆蓋數據,
每組數據包含左端和右端,
計算總覆蓋長度。


解題策略:
將數據讀進來後先排序,
再從頭開始遍歷,
並且紀錄覆蓋長度的總和,
最後即為答案。


程式碼參考:
$C++$:
$JUDGE\_RESULT$:$AC \ (10ms, \ 428KB)$
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#define f first
#define s second
#define _ ios::sync_with_stdio(false), cin.tie(nullptr);
#define endl '\n'
using namespace std;
int main() { _
    int n, ans = 0, cur;
    cin >> n;
    vector<pair<int, int>> v(n);
    for (auto& i : v)
        cin >> i.f >> i.s; // 記錄線段左端和右端
    sort(v.begin(), v.end()); // 排序
    cur = v.front().f; // 定位現在位置
    for (const auto& i : v) {
        cur = max(cur, i.f);
        if (i.s > cur) { // 如果有線段還沒被覆蓋
            ans += i.s - cur;
            cur = i.s;
        }
    }
    cout << ans << endl;
}
$PYTHON$:
$JUDGE\_RESULT$:$AC \ (61ms, \ 5MB)$
from sys import stdin
n = int(stdin.readline().strip())
f = [[int(x) for x in stdin.readline().strip().split()] for _ in range(n)] # 記錄線段左端和右端
f.sort() # 排序
ans = cur = 0 # 定位現在位置
for i in f:
    cur = max(cur, i[0])
    if i[1] > cur: # 如果有線段還沒被覆蓋
        ans += i[1] - cur
        cur = i[1]
print(ans)



以上,
若有更好的想法歡迎提出哦!

留言

熱門文章