度小滿2018 9 26筆試 鏈式邊權

2021-08-28 11:53:03 字數 2842 閱讀 7331

第一條邊能形成乙個點對(1,2)

第二條邊能形成乙個點對(2,1)

所以,輸出為1 1

#include

//vs2017建控制台程式自帶的預編譯標頭檔案

#include

#include

#include

using

namespace std;

intmain()

for(

int i =

0; i < n -

1; i++)}

if(i !=0)

printf

("%d "

, w[i]);

}return0;

}

重點解釋一下,內層迴圈裡面的加加和減減吧,還有w[i] = w[i] + w[i - 1];,這句一看就是很像是動態軌跡裡面的遞推式。

以乙個實際例子講解吧:

輸入:4

1 2 3 4

輸出:3 4 3

初始時:

執行完第一次外層迴圈後:

就得到了第一條邊的權值,權值為3的含義是有這三個點對。剩下三個點的權值都為-1,假如1稱為已經記錄的點,那麼這個-1就代表當前點與已記錄點之間能形成多少點對,比如2這個點與已記錄點1之間能形成乙個點對(1,2),所以2點在當前的權值為-1。(注意這裡以及之後的「權值」不是指原題中指的權值)

執行完第二次外層迴圈後:

就得到了第二條邊的權值,權值為4的含義是有這四個點對。首先這個2很好理解,從當前點2往後遍歷,發現有兩個點對(2,3)(2,4)。但是1和邊右面的點還沒有統計,但是也不需要統計,因為這個資訊肯定包括在之前記錄的點1的權值裡面即(1,2)(1,3)(1,4),但是由於(1,2)不應該包括進來,所以這時候之前在點2記錄的權值-1即(1,2)就派上了用場,這樣,(3-1)就得2即(1,3)(1,4)。

第三次外層迴圈也是乙個道理。

總結一下:

1.第i次迴圈結束後,第i條邊的權值會被記錄。也稱0 - i的點們已經被記錄,因為0 - i的點們和i+1 - n-1的點們之間能形成的點對數量已經被w[i]所記錄,也就是題意的意思。

2.第i次迴圈結束後,從i+1 - n-1的點的權值也會被更新:注意i+1 - n-1的點們的權值必為負值,他的絕對值是指,當前點與已經記錄的點之間形成的點對數量。

3.除開第一次外層迴圈,每次外層迴圈i中,對w的更新都是兩部分:第一是當前點i與邊右面的點之間形成的點對數,這個是用內層迴圈做的;第二是0 - i-1的點們與邊右面的點之間形成的點對數,這個資訊已經被w[i-1]儲存,但資訊不是都需要的,需要除開0 - i-1的點們與點i之間形成的點對數,而這個需要除開的數量剛好就是當前w[i]存的負值的絕對值。

這是第二種用法,python3**。思路與上一種完全一樣,但具體細節實現有所不同。

首先重點理解下我這句話,要得到乙個數x和乙個數的陣列yarray之間可以形成多少個點對,只需要得到yarray的長度減去yarray中x的數量。

使用了collections.counter(),是計數器的功能,可以得到乙個鍵值key出現的次數。

import collections

n =eval

(input()

)a =

list

(map

(int

,input()

.split())

) lw = collections.counter(

)l_count =

0rw = collections.counter(a)

r_count = n

res =[0

]*(n-1

)for i in

range

(n-1):

lw[a[i]]+=

1 l_count +=

1 rw[a[i]]-=

1 r_count -=

1 res[i]

= res[i-1]

+(r_count - rw[a[i]])

-(l_count - lw[a[i]])

#第0次迴圈不需要單獨加判斷,因為res[-1]=res[0]=0

print

(' '

.join(

map(

str,res)

))

和上一種**一樣,在每次迴圈i中,(r_count - rw[a[i]])代表了當前點i與邊右面的點之間形成的點對數。res[i-1] - (l_count - lw[a[i]])代表0 - i-1的點們與邊右面的點之間形成的點對數,這個資訊已經被res[i-1]儲存,但需要除開一部分資訊即0 - i-1的點們與點i之間形成的點對數,需要除開的資訊剛好就是(l_count - lw[a[i]]),注意lw[a[i]])至少為1。

再解釋一下,這個需要除開的資訊,就是,邊左面的點的數量減去邊左面的點中a[i]出現的次數,即為0 - i-1的點們與點i之間形成的點對數。

2015筆試記錄

0916去哪兒網 1.removeelement arr,index 這麼簡單的題竟然寫錯了,把splice方法的返回值記錯了,splice返回的是刪除的元素陣列!2.陣列亂序問題 以前看過fisher yates的洗牌演算法,所以有點思路,但還是有細節錯誤 math.random 的範圍是 0,1...

中興2016筆試

簡答題 1 ip位址和mac位址有什麼區別?為什麼要有這兩種位址?對於ip位址,相信大家都很熟悉,即指使用tcp ip協議指定給主機的32位位址。ip位址由用點分隔開的4個8八位組構成,如192.168.0.1就是乙個ip位址,這種寫法叫點分十進位制格式。ip位址由網路位址和主機位址兩部分組成,分配...

2019 6 5筆試回顧

1.union和union all的區別 答案來自w3cshool select city,country from customers union select city,country from suppliers 上面的語句返回t 消費者和t 商的城市,國家。set 無重複 注 武漢,中國 和...