前往
大廳
主題

ZeroJudge - c489: kevin 的啃得雞 解題心得

Not In My Back Yard | 2020-11-01 00:29:54 | 巴幣 2 | 人氣 260

題目連結:


題目大意:
輸入第一列給定一正整數 N (N ≦ 10 ^ 6),代表 kevin 訂的紙包雞派對餐只剩 N 塊紙包雞。原本的紙包雞派對餐應為 K 種口味、每種口味 M 塊,而現在有其中一種口味的少了一些。

第二列給定 N 個整數,代表各塊紙包雞的口味編號。試問哪個口味的紙包雞少了?

記憶體限制:5 MB。



範例輸入:
7
1 2 1 3 4 3 4


範例輸出:
2


解題思維:
如同其他記憶體限制很緊的其他題(如這題)一樣,本題用 C++ 寫的話不能引入 <iostream> 這個標頭檔。



因為只有一種口味少了,所以會有一種口味的數量與別的口味之數量不一樣,而那個口味就是我們要找的。但我們不能將這 N 塊紙包雞的口味編號直接用陣列存下來,會超出記憶體限制。

而我們可以利用狀態壓縮的精神,藉由統計每個數字的位元來統計「數量」。例如有 5 、 3 、 3 、 2 、 2,這三個數字,而這三個數字的二進位表達式依序為 101 、 011 、 011 、 010 、 010。可以看到由左到右每個位置的位元出現了 1 、 4 、 3 次的 1 。

而上面的例子可以看到 5 只出現了一次,其他數字出現了兩次,因此在統計到 5 的時候會造成上例三個位元中左邊以及右邊的位元之 1 的出現數不是 2 的倍數。藉此就可以知道左邊以及右邊的位元是少了的紙包雞之口味編號的二進位表達式為 1 的位元,即代表二進位數字 101 、十進位的 5 。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作