ZeroJudge e289: 美麗的彩帶

你有一條彩虹色的彩帶,但是因為它是異世界來的彩帶,所以可能不只 7 個顏色 (異世界有可能有 87 色的彩虹),你有一個定義彩帶美麗度的標準,你定義一條彩帶的美麗度為它所擁有的長度為 M 且有 M 種顏色的子區間數量。

現在你需要寫一個程式來計算一個字串的美麗度。

範例測資

範例輸入範例輸出
第一行有兩個數字 M 和 N,代表定義的子區間長度和彩帶長度。
第二行有 N 個數字代表彩帶的顏色。
輸出這條彩帶的美麗度。
3 7
1 2 3 5 4 5 4
3

解題思路

因為數字最大會是 10 的 150 次方,所以要用字串的方式來收彩帶的數字。使用 Map 來紀錄每個區間的數字數量,並且宣告一個變數 number 來紀錄目前的區段中有多少個不同的數字。

跑一個 For迴圈 從 0 到 N-1,並且每次都將新的資料紀錄到 Map 中並且把最左邊的資料做刪除,如果刪除的資料中的 Map 值是 0,那就 number–,代表區段中少了一個不同的數字。並且如果新加入的數字的 Map 值是 1,代表是一個全新的數字 number++,每次迴圈都要判斷 number 是否等於 M,如果有等於的話就將答案 +1。

範例程式碼-ZeroJudge e289: 美麗的彩帶

#include <iostream>
#include <map>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int M, N;
    string num[200000] = {};
    map<string, int>appear;
    cin >> M >> N;
    for (int i = 0; i<N; i++) {
        cin >> num[i];
    }
    int count = 0, last = 0, ans = 0, number = 0;
    for (int i = 0; i<N; i++) {
        const string current = num[i];
        if (count <= M-1) {
            appear[current]++;
            count++;
            if (appear[current] == 1) number++;
            if (number == M) ans++;
        }
        else {
            appear[num[last]]--;
            if (appear[num[last]] == 0) number--;
            appear[current]++;
            if (appear[current] == 1) number++;
            last++;
            if (number == M) ans++;
        }
    }
    cout << ans << "\n";
}

//ZeroJudge E289
//Dr. SeanXD

發佈留言