你就是乙個畫家!你現在想繪製一幅畫,但是你現在沒有足夠顏色的顏料。為了讓問題簡單,我們用正整數表示不同顏色的顏料。你知道這幅畫需要的n種顏色的顏料,你現在可以去商店購買一些顏料,但是商店不能保證能**所有顏色的顏料,所以你需要自己混合一些顏料。混合兩種不一樣的顏色a和顏色b顏料可以產生(a xor b)這種顏色的顏料(新產生的顏料也可以用作繼續混合產生新的顏色,xor表示異或操作)。本著勤儉節約的精神,你想購買更少的顏料就滿足要求,所以兼職程式設計師的你需要程式設計來計算出最少需要購買幾種顏色的顏料?
第一行為繪製這幅畫需要的顏色種數n (1 ≤ n ≤ 50)第二行為n個數xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各種顏料.
輸出最少需要在商店購買的顏料顏色種數,注意可能購買的顏色不一定會使用在畫中,只是為了產生新的顏色。示例1
31 7 3
3思路:這題完全顯示出了自己的數學功底是真滴菜啊,看不出來本質上是矩陣求秩啊。
我們還是需要回顧下異或運算的性質的,a^b=c,則a^c=b,對於該題,兩個數的二進位制表示我們可以將其看做行向量,之後我們需要思考為什麼本題可以轉化為求矩陣的秩。
由於本題是求最少需要多少種顏料從而使得能夠實現我們所需的所有顏色,「最少」的要求使得我們需要思考什麼數是必須要存在的,並且這個數能使全域性最優。我們假設數字x的某一位為1,為了讓數字x不可或缺,我們就需要讓這一位上的1是唯一出現的,也就是說我們可以通過讓這個數和其他所有相應位為1的數進行異或,從而使得只有x上的這一位為1,剩下的數以此類推。為了避免重複,我們需要每次將剩下的元素進行排序,並按照高位到低位來模擬(這不就是矩陣求秩嘛!)
#include#includeusing namespace std;
int n,a[199];
int main(void)
int i=0;
for(;a[i]==0;i++);
printf("%d\n",n-i);
return 0;
}
位元組跳動歷屆筆試題(1)
有三隻球隊,每只球隊編號分別為球隊1,球隊2,球隊3,這三隻球隊一共需要進行 n 場比賽。現在已經踢完了k場比賽,每場比賽不能打平,踢贏一場比賽得一分,輸了不得分不減分。已知球隊1和球隊2的比分相差d1分,球隊2和球隊3的比分相差d2分,每場比賽可以任意選擇兩隻隊伍進行。求如果打完最後的 n k 場...
網易有道筆試題
這幾道題都是從網上找的不知道是哪一年的網易有道的筆試題,拿來做做,練練手。1 列印如下形式的矩陣 n 5 1 2 9 10 25 4 3 8 11 24 5 6 7 12 23 16 15 14 13 22 17 18 19 20 21 n 6 1 2 9 10 25 26 4 3 8 11 24 ...
網易 筆試題(20190921)
要使得數字和達到要求並且最小,那就是剛好等於x值,即n值從後往前填充,逢9向前移一進製。def min bit sum x if x 10 return x res 0 base 1while x if x 9 res 9 base x 9else res x base x 0 base 10ret...