演算法題 一起來挑戰GCJ

2021-10-03 09:07:32 字數 3015 閱讀 1323

2.7.1 minimum scalar product

題述:有兩個向量 v1=和 v2 =,允許任意交換 v1和v2各自的分量的順序。請計算 v1 和 v2的內積

x1y1+。。。+ xnyn 的最小值。

題解:@1:如果我們先固定 v1的排列順序,之後列舉 v2的排列,之後計算彙總求最小值,這樣的話 複雜度為 o(n!*n) ,這是非常大的,如果n很大,我們很容易超出時間限制。

@2:我們直覺將 v2 按照降序排列, v1按照公升序排列,我們使用 n=2進行證明這一觀點,(這時 x1>x2, y1y1 + x2y2    x1y2 + x2y1 ,我們很容易看出 第二組更小。

這時我們推至 n > 2 ,依舊可以很清楚看到 第二組情況最小。

這時提一句: v1 公升序,v2降序 和v2公升序,v1降序得到的結果是相同的。?

**如下:

using ll=

long

long

;ll getmininnerproduct

(vector<

int>

&ivec1,vector<

int>

&ivec2));

ll innerproduct=0;

for(

decltype

(ivec1.

size()

) i =

0; i !=ivec1.

size()

;++i)

return innerproduct;

}

2.7.2 crazy rows

題述:給定乙個由 0 和 1 組成的方格矩陣。 只允許交換相鄰的兩行 (第 i 行 和 第 i+1 行),要把矩陣化成下三角矩陣 (主對角線上方的元素都是 0 )最少需要交換幾次? 輸入的矩陣保證總能化成下三角矩陣。

1111

111010

001100

=》 1100

=》。。。。 110

01000

110011

001000

110011

10

1<=n<=40

題解:

策略:我們能夠清晰的看出 僅僅保證 正對角線上的數字為1,且其右上方的數字都為0即可

解決辦法:

第一行: 第乙個元素為1或0,其餘為0

第二行:第二個元素為1或0, 第二個元素前面為任意,其餘為0

第三行:第三個元素為1或0,前面任意,其餘為0

由此我們得出:我們僅僅記錄每一行最後乙個1的位置即可(無1記錄為 -1 ),之後呢,我們迴圈該存放每一行最後的1位置的陣列,

每一步都找從該行開始的小於等於 當前行號的角標,進行逐步交換累加步數。

const

int n =4;

const vectorint>> m,,

,};vector<

int>

posvec

(n,-1)

;void

solve()

}for

(int i =

0; i!= n;

++i)

}//完成交換

for(

int j = pos; j > i ;

--j));

cout<++res;}}

cout<< res;

}

2.7.3 brige the prisoners

題述:如下圖,乙個監獄裡有 p 個併排著的牢房。 從左至右一次編號為 1,2,。。。。。p。最初所有的牢房裡都住著乙個囚犯。相鄰的兩個牢房之間有乙個窗戶,可以通過它與相鄰牢房裡的囚犯對話。

123

4 p

【1】| 【1】 |【1】|【1】|【。。。。】 |【1】

【】:代表牢房, | :代表窗戶

監獄的情況

現在要釋放一些囚犯,如果釋放某個牢房裡的囚犯,其相鄰的牢房裡的囚犯就會知道,因而發怒暴動。所以,釋放某個牢房裡的囚犯同時,必須要賄賂兩旁相鄰牢房裡的囚犯一枚金幣。

另外,為了防止釋放的訊息在相鄰牢房間傳開,不僅兩旁直接相鄰的牢房,所有可能聽到訊息的囚犯,即直到空牢房為止或直到監獄兩端為止,此間的所有囚犯都必須給一枚金幣。

釋放

空牢房 1 牢房最右側端

。。。|【】|【1】|【1】|【1】|【】|【1】【1】【1】

\ /

\ /

都必須給一枚金幣

現在要釋放 a1,a2,。。。。aq號牢房裡的 q 名囚犯,釋放的順序還沒確定。如果選擇所需金幣數量盡量少的順序釋放,最少需要多少枚金幣?

題解:

在這裡插入**片

2.7.3 millionaire

題述: 你被邀請到某個電視節目中取玩下面這個遊戲。一開始你有 x 元錢,接著進行 m 輪賭博。每一輪,可以將所持的任意一部分錢作為賭注。堵注不光可以是整數,還可以是小數,一分錢不壓和全壓都沒有關係,每一輪都有 p 的機率可以贏,贏了賭注就會翻倍, 輸了賭注就沒了,如果你最後持有 1000000 元以上的前的話,就可以把這些錢帶回家。 請計算當你採取最優策略時,獲得 1000000元以上的錢並帶回家的概率。

限制條件:

輸入: m=

1,p=

0.5,x=

50000 輸出 0.500000 (一開始全壓)

題解:

在這裡插入**片

一起來挑戰Google code jam 一

給你兩個陣列va和vb,兩個陣列的元素對應相乘,然後求和,要求和最小,在陣列元素順序可以調整的時候。這裡主要用到乙個不等式,x和y兩個公升序的陣列,那麼sum x i y i sum x i y n i void fun printf d n res 題意是給你一排p個牢房,最初的時候每個牢房中有乙...

一起來學習Ant Design

當然,都屬於webpack中的基礎知識,但是套上了atool build這樣乙個殼子,又有點小懵。還好不是很難,嘗試後,很快搞定了,順手也總結一下吧!一 安裝ant init 1 npm install antd init g 二 建立目錄 1 mkdir antd demo cd antd dem...

一起來存方法

1.在動態渲染元素的時候,需要邏輯判斷 在迴圈渲染dom元素時,迴圈遍歷中需要邏輯操作,如果不使用模板 1 var addlist function 7 if 條件2 10lists.push list 11 12 id html lists.join 13 這是在看一同事 時,發現她用push和j...