[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)
以上,
若有更好的想法歡迎提出哦!
留言
張貼留言