網易筆試程式設計題 混合顏料

2021-07-24 22:03:41 字數 2454 閱讀 7897

題目描述:你就是乙個畫家!你現在想繪製一幅畫,但是你現在沒有足夠顏色的顏料。為了讓問題簡單,我們用正整數表示不同顏色的顏料。你知道這幅畫需要的n種顏色的顏料,你現在可以去商店購買一些顏料,但是商店不能保證能**所有顏色的顏料,所以你需要自己混合一些顏料。混合兩種不一樣的顏色a和顏色b顏料可以產生(a xor b)這種顏色的顏料(新產生的顏料也可以用作繼續混合產生新的顏色,xor表示異或操作)。本著勤儉節約的精神,你想購買更少的顏料就滿足要求,所以兼職程式設計師的你需要程式設計來計算出最少需要購買幾種顏色的顏料?

輸入描述:

第一行為繪製這幅畫需要的顏色種數n (1 ≤ n ≤ 50)

第二行為n個數xi(1 ≤ xi ≤ 1,000,000,000),表示需要的各種顏料.

輸出描述:

輸出最少需要在商店購買的顏料顏色種數,注意可能購買的顏色不一定會使用在畫中,只是為了產生新的顏色。

輸入例子:

3 1 7 3

輸出例子:

3 做法類似於求用初等行變換來求矩陣的秩。要得到唯一的顏料數字個數,就是求出該矩陣線性無關的基底個數,即秩。將每個數字按照從小到大排列,他們的二進位制形式可以看成是乙個矩陣,比如1,7,3這三個數字,首先從小到大排列:1,3,7。將他們用二進位制表示即為

0001

0011

0111,

官網給的這個例子不好,因為這個矩陣不需要初等行變換就能得到它的秩為3,為此,我們重新造一組輸入用例:1, 2, 3, 6, 7, 8, 13。雖然很簡單,但能說明問題就好,他們的二進位制表示為:

第一行:0001

第二行:0010

第三行:0011

第四行:0110

第五行:0111

第六行:1000

第七行:1011

我們從前往後進行掃瞄(當然也可以從後往前開始掃瞄),在這個矩陣中,第二行和第三行最高位可以消除,經過異或,消除最高位,即得到0001,判斷該數字在矩陣中是否存在,如果存在,就不插入;第四行和第五行可以消除,經過異或,消除最高位,即得到0001,判斷該數字在矩陣中是否存在,如果存在,就不插入;第六行和第七行可以消除,經過異或,消除最高位,得到0011,判斷該數字在矩陣中是否存在,若存在,就不插入。

因為我們是要求出基數的個數,所以對於高位相同的兩個數字,我們可以刪除乙個,保留該種類的基數存在乙個即可。得到的結果為:

第一行:0001

第二行:0010

第三行:0110

第四行:0011

重新進行排序有:

第一行:0001

第二行:0010

第三行:0011

第四行:0110

繼續對相鄰兩行進行異或操作,得到:

第一行:0001

第二行:0010

第三行:0110

因此,得到該矩陣的秩:3,也就是說,數字1, 2, 3, 6, 7, 8, 13,可有三個數經過異或得到,這三個數可以是:1,2,6,也可以是其他(其他可能是由於選擇刪除兩個高位相同的數字不同而得到不同的數字)。

演算法描述:

首先讀入元素並存入動態陣列vector中,並 對元素從小到大進行排序。開始迴圈, 定義while迴圈條件,當動態陣列元素個數大於2時,繼續迴圈(因為若要進行顏料混合,最少需要2個,當動態陣列的元素少於2個時,就不用進行初等行變換了,即不需要顏色混合了),在迴圈體外定義了兩個下標分別指向動態陣列倒數第乙個和倒數第二個,判斷下標所指向的數字最高位1的位置是否相同,如果相同,則進行異或操作,再判斷得到的新值是否在陣列中,如果不在,則將新值插入動態陣列中,再對其進行排序。如果下標所指向的數字最高位1的位置不同,則計數器加一,將動態陣列最後乙個元素彈出,兩個下標上移(自減)。重複這個過程,直到迴圈結束,輸出動態陣列中元素個數(其實是2)+ 計數器值即得到顏料數字基的個數,也就是秩的大小。

程式**如下:

#include 

#include

#include

using

namespace

std;

int thenumofone(int num);

int main(void)

sort(nums.begin(), nums.end());

int rank = 0;

int thelastone = nums.size() - 1;

int uperofthelastone = thelastone - 1;

while(nums.size() > 2)

}else

nums.pop_back();

thelastone --;

uperofthelastone --;

}cout

<< rank + 2

<< endl;

return0;}

int thenumofone(int num)

return cnt;

}

若有錯誤之處,敬請指正。

網易筆試程式設計題

時間限制 1秒 空間限制 262144k 又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。牛牛覺得這個問題太簡單,所以希望你來替他回答。輸...

網易 混合顏料

你就是乙個畫家!你現在想繪製一幅畫,但是你現在沒有足夠顏色的顏料。為了讓問題簡單,我們用正整數表示不同顏色的顏料。你知道這幅畫需要的n種顏色的顏料,你現在可以去商店購買一些顏料,但是商店不能保證能 所有顏色的顏料,所以你需要自己混合一些顏料。混合兩種不一樣的顏色a和顏色b顏料可以產生 a xor b...

網易筆試 程式設計

1 一片1000 1000的草地,初始站在 1,1 最左上角 每一秒小易都會橫向或縱向到相鄰草地吃草 不會越界 反派超超手上有n個陷阱,第i個陷阱位置 xi,yi 小易一旦進陷阱就會 獲,為解救小易,請計算小易最少多少秒可能會走入乙個陷阱,提前提醒小易 輸入描述 第一行 n 超超的陷阱數 第二行 n...