CF1630C(區間覆蓋)

2022-10-09 10:09:11 字數 1153 閱讀 1273

傳送帶:cf1630c

給定 \(n\) 個元素,第 \(i\) 個元素有乙個值 \(a_i\) 和乙個顏色 \(c_i\), 給定 \(a_i\) 的值 \(c_i\) 的值為 \(0\), 可以執行無限次如下操作,每次選擇滿足 \(1 \leq i < j < k \leq n, c_i = c_j = c_k = 0\) 且 \(a_i = a_k\) 的三個位置,然後將 \(s_j\) 變成 \(1\) , 求 \(\sum_^n c_i\) 的最大值。

將由前面的分析提取出的區間排序後,我們考慮如何讓答案更優。對於每個可以合成乙個區間的區間段的兩端的端點,顯然是不能計算在內的,而其中的非端點一定能修改為 \(1\),除此之外的區間如果進行題面中的操作,必然有乙個端點最終不能被計算在內。可以發現答案為:區間段長度-剩餘區間個數-1。也就是說要保留最少的區間個數。

具體地方法為:可以採取掃瞄線的方法,初始的值為 \(0\) ,每次對比時,將下乙個區間的左邊界 \(l\) 與掃瞄線的值 \(val\) 比較,如果 \(l\leq val\) 的話,相當於當前的區間被下乙個區間代替後,結果更優,否則當前的必須保留。

#include using namespace std;

using pii = pair;

const int n = 2e5 + 10;

int n;

int a[n], cnt, l[n], r[n];

setst; //用set自動排序

vectorv;

// 對當前的區間段計算答案

int res()

}return len - cnt;

}void slove()

for (int i = 1; i <= n; i++)

if (st.empty())

int ans = 0;

for (auto [x, y] : st)

else if (v.back().second < x)

else if (v.back().second < y) v.emplace_back(x, y);//與上乙個相交

} ans += res();

cout << ans << '\n';

}int main()

return 0;

}

C 區間覆蓋 貪心演算法

數軸上有 n個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 不可能辦到輸出 1。定義乙個結構體代表區間,在讀入資料後,對資料進行多關鍵字排序 第一是左端點小的在前,第二是右端點大的在前 對資料進行過濾,左端點相同的區間只保留區間長度最大的,如果當前區間被之前保留的區間完全包含則去掉。...

區間覆蓋(week3 作業C)

描述 數軸上有 n 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 不可能辦到輸出 1 輸入 注意,輸入包含多組測試資料,請處理到檔案結束 第一行 n和 第二行至n 1行 每一行乙個閉區間。輸出 選擇的區間的數目,不可能辦到輸出 1 樣例輸入 3 10 1 73 6 6 10 樣例輸...

week3作業 C 區間覆蓋

描述 數軸上有 n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1,000,000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1 輸入 第一行 n和t 第二行至n 1行 每一行乙個閉區間。輸出 選擇的區間的數目,不可能辦到輸出 1...