description
dalong的舅舅最近到外地旅遊時給dalong帶回來一種神奇的水果:多彩瓜。這種瓜太漂亮了,它有很多層,每一層都是一種顏色。由於多彩瓜放久了會變壞,dalong決定每天吃一層,可是多彩瓜有好多層,每天吃一層的話還沒吃完多彩瓜就壞了,因為多彩瓜顏色很多,dalong把一些很相近的顏色認為是同一種顏色,這樣合併顏色後多彩瓜就沒有原來這麼多層了,dalong就可以在多彩瓜變壞之前吃完它嘍~oh,yeah。現在dalong告訴你多彩瓜最初每一層的顏色,顏色之間的關係,你能幫助他算出吃完這些瓜要幾天麼?注意,如果dalong認為顏色a和顏色b是同一種顏色,顏色b和顏色c是同一種顏色,那麼顏色a和顏色c也是同一種顏色。
input
多組資料測試
對於每組資料
輸入的第一行是乙個正整數n(1 <= n <= 50000),m(1 <= m <= 100)表示多彩瓜最初有n層,一共有m種不同的顏色。
第二行有n個數,第i個數colori表示多彩瓜第i層的顏色(1 <= colori <= m).
第三行是乙個正整數k(0 <= 3000 <= k),表示有k組顏色存在相似認為相同的關係。
後面k行,每行兩個正整數a,b(1 <= a, b <= m 且 a != b),表示dalong認為a和b是同一種顏色。
輸入的最後是兩個0,表示輸入結束,這組資料不用處理
output
對於每組資料,輸出dalong需要幾天吃完多彩瓜
sample input
5 31 1 2 3 1
11 2
0 0sample output
3hint
因為1和2是同一種顏色,那dalong第一天可以吃掉前3層(1,1,2),第二天可以吃掉第四層(3),第三天吃掉最後一層(1)。因此吃完多彩瓜需要3天。
思路:很顯然是點的合併,用並查集。
#include#include#includeusing namespace std;
const int n=50005,m=105;
int n,m;
int in[n];
int father[n];
int find(int u)
return u;
}void union(int a,int b)
else
}int main()
int tmp;
scanf("%d",&tmp);
for(int i=1;i<=tmp;i++)
}int ans=0;
int now=0;
for(int i=1;i<=n;i++)
}printf("%d\n",ans);
}return 0;
}
老BOJ 16 棋盤分割
棋盤分割 accept 46 submit 186 time limit 1000ms memory limit 65536kb description 將乙個 n 1 次後,連同最後剩下的矩形棋盤共有 n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為...
拔河 動態規劃 BOJ 216
乙個學校舉行拔河比賽,所有的人被分成了兩組,每個人必須且只能夠在其中的一組,要求兩個組的人數相差不能超過1,且兩個組內的所有人體重加起來盡可能地接近。輸入n n 和n n n個整數wi w i代表每個人的體重。輸出兩個整數,分別代表兩組的體重之和。3 100 90 200190 200n 100.n...
BOJ 488 小妹妹個數
題意 給出數字n 1 n 1000000000 求出小於等於n的質數的個數 打表也需要技巧的 10億內有5000多萬個素數,所以沒法直接打出所有的素數直接二分查詢。我們可以利用平方分割的方法,用乙個桶儲存在該桶範圍內中素數的個數。最後再求解的過程中,對於處於桶範圍內的數,直接求和,處在桶範圍外的數,...