MG loves gold
MG是一個運氣爆表的男孩子,他總能從地下挖掘出埋藏着的金克拉。 地下的金克拉寶藏可以看成n個元素組成的序列,每一種金克拉擁有自己的顏色C。 MG每次可以用掉一把鏟子挖走連續一段,但是他不願意使用同一把鏟子挖到同一種顏色的金克拉。 MG作爲一個十分貪心的人,他希望可以用最少的鏟子挖走所有的金克拉。 我們規定,某一位置的土地只能被鏟子挖掘一次。 MG認爲這件事非常容易,不屑於用計算機解決,於是運用他高超的人類智慧開始進行計算。作爲一名旁觀者,你也想挑戰MG智慧,請你寫個程序,計算答案。
第一行一個整數T,代表數據組數(1<=T<=10)。 接下來,對於每組數據—— 第一行一個整數n,表示金克拉序列長度(1<=n<=100000)。 接下來一行n個整數C,表示金克拉顏色(∣C∣<=2000000000)。
對於每一組數據,輸出一行。
該行有一個整數,表示MG最少使用幾把鏟子。
2 5 1 1 2 3 -1 5 1 1 2 2 3
2 3
#include<cstdio>
#include<set>
using namespace std;
set<int> s;/*set集合容器:實現了紅黑樹的平衡二叉檢索樹的數據結構,
插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保
證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點
的鍵值;另外,還得保證根節點左子樹的高度與右子樹高度相等。*/
int main()
{
int T;
int f[100005];
scanf("%d",&T);
while(T--){
int ans=1;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&f[i]);
s.clear();
for(int i=0;i<n;i++){
if(s.count(f[i])){//返回s中的a[i]的個數
s.clear();
ans++;
}
s.insert(f[i]);
}
printf("%d\n",ans);
}
return 0;
}