Codeforces Round #686(Div.3) [C- Sequence
阿新 • • 發佈:2020-11-29
Codeforces Round #686(Div.3) C- Sequence Transformation
題目大意:一個數組,選定陣列中一個數x,每次可以刪掉不包含x的一段,使得最終陣列只剩下x,求最小的刪除次數。
可以將一段連續相同的數看成一個數字,然後記錄它的出現次數。最小值就是出現次數+1。特例:該數出現在陣列開頭或結尾,這兩種情況每次出現都要-1。
code1
#include <iostream> #include <algorithm> #include <map> using namespace std; const int N = 2e5 + 10; int a[N]; int main() { int t; cin >> t; while(t--) { int n; cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; map<int, int> mp; for(int i = 1; i <= n; i++) { if(a[i] == a[i - 1]) continue; mp[a[i]]++; } mp[a[1]]--; // 出現在開頭 mp[a[n]]--; // 出現在結尾 int res = n; for(int i = 1; i <= n; i++) { res = min(mp[a[i]] + 1, res); } cout << res << endl; } }
code2
#include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; int main() { cin.tie(nullptr); int t; cin >> t; while(t--) { int n; cin >> n; vector<int> a(n); for(auto& x : a) cin >> x; a.erase(unique(a.begin(), a.end()), a.end()); // stl 去重 map<int, int> mp; n = a.size(); for(auto x : a) mp[x]++; int res = n; for(auto& x : a) { res = min(res, mp[x] + 1 - (a[0] == x) - (a[n - 1] == x)); } cout << res << endl; } }