2008年百度之星第一場初賽題目(一起學習學習)

1. 廣告排名區間 (10分)

問題背景

shifen廣告消費預估系統可以估計出一段時間內一個特定的廣告在檢索結果中排在各個位置的機率。比如系統對某廣告的輸出如下:

p1 = 0.03, p2 = 0.08, p3 = 0.04 ……

這說明該廣告展現在第1位的概率是 3%,展現在第2位的概率是 8%,展現在第3位的概率是 4%……

問題是:如何給出一個排名估計區間[i, j],使得廣告出現在該區間中的概率大於或等於一個預設值p,同時這個區間所包含的元素儘可能的少。也可用數學語言來描述:給定數p和數列 p1, p2, … , pn,求 i和 j (1 <= i <= j <= n),在滿足pi + pi+1 + … + pj >= p的前提下讓j-i 最小。

一般來說,pi只需保留6位小數就足夠了。這樣,若令ai=106pi,a=106p,則a和所有的ai均爲[0,106]之間的整數。這樣就避免了對實數的處理。

 

輸入格式

第一行包含一個整數n (1 <= n <= 100,000)。

以下n行每行包含一個[0,106]內的整數,依次爲a1,a2,…,an。這n個整數之和保證不超過106。

最後一行包含一個[0,106]內的整數a。保證所有ai之和不小於a。

 

輸出格式

輸出僅一行,包含一個整數,即j – i的最小值。

 

樣例輸入

7

5

8

4

7

10

5

2

18

 

樣例輸出

2

樣例解釋

a2=8, a3=4, a4=7之和爲19,滿足條件。而任何兩個相鄰數之和均小於18。

--------------------------------------------------------------------------------------------------------------

 2. LZW網頁判重 (20分)

問題背景

有一種簡單的網頁判重的方法,通過求兩個網頁內容的最長公共子序列(LCS)長度來判定兩個網頁的相似程度。如:

(網頁A)老師:請用“果然”造句。

(網頁B)學生:先喫水果,然後喝汽水……

它們的最長公共子序列爲“果然”,長度爲2。注意這裏的“子序列”並不要求連續。

類似的,下面兩個網頁:

(網頁A)老師:請用“果然”造句。

(網頁B)學生:先喫水果,然後喝汽水,果然拉肚子……

最長公共子序列還是“果然”,長度爲2。但不難看出,由於“果然”兩個字在網頁B中也曾連續出現,第二組網頁比第一組更加“相似”。爲了區分開這兩種情況的區分度,我們改用一種稱爲LZW的理論。爲了嚴格的敘述相似度的計算方法,我們首先定義“文本單元”。

假定網頁用一個不包含空白字符(空格、回車換行、水平製表符)的字符串來表示。它只包含純文本,沒有標籤。在計算相似度之前,你應該首先對該字符串 進行處理,劃分成一個個“文本單元”。每個文本單位可以是一箇中文字、英文單詞(由一個或多個連續的半角英文字母和數字組成,正規表達式爲[a-zA- Z0-9]+)、或者一個標點符號。

根據上述定義,同一個標點符號的全角和半角應該被作爲不同的文本單元,儘管他們看起來可能很相近;每個單獨全角英文和全角數字都應該被看成一個單獨的文本單元,而連續的半角英文字母和數字應被看成一個整體。總之,全角的字符可以與中文字同等對待。

這樣,網頁被看成文本單元序列。例如,網頁“內容?123456??web2.00#”切分出的文本單元序列爲(爲了顯示方便,用下劃線分隔各文本單元):
內_容_?_1_2_345_6_?_?_web2_._00_#

而網頁“why內容相似??1234567890,web#00”的切分結果爲:
why_內_容_相_似_?_?_1234567890_,_web_#_00

黑體部分給出了兩個網頁的一個公共子序列。注意“內容”、“??”分別在兩個網頁中都是連續出現的文本單元。爲了獎勵這種情況,LZW規定一段由連 續k個文本單元組成的字符串權值爲k2。在剛纔的例子中,“內容”、“??”的權值均爲4。但“00”是一個數字串,應當被看成一個單獨的文本單元。所以 權值僅爲1。

根據上述規則,公共子序列“內容 ?? 00”的權值爲22+22+1=9。在所有可能的子序列中,這個權值是最大的。

給定兩個網頁,求他們的LZW相似度,即所有可能的公共子序列中的最大權值。

注意

1) 輸入的網頁內容以GBK編碼

2) 除了大小寫英文字母和數字之外的其他半角字符均視爲標點符號。

 

輸入格式

包含兩行,分別是網頁A和B對應的字符串(不包含空白字符)。每行至少包含5個字節,最多包含200個字節

輸出格式

輸出僅一行,包含一個整數,爲兩個網頁的LZW相似度。

 


樣例輸入

內容?123456??web2.00#

why內容相似??1234567890,web#00

樣例輸出

9

樣例解釋

儘管兩個網頁裏看上去都有“123456”但一方面第一個網頁中混雜的全角和半角字符,而另一方面,即使全部改成半角字符,由於數字串“123456”和“1234567890”將分別看成一個單獨的文本單元,因此無法部分匹配。

提示:


如何處理漢字?

答:如非特別說明,astar比賽中的所有漢字輸入輸出均用GBK編碼。GBK 採用雙字節表示,總體編碼範圍爲 8140-FEFE,首字節在 81-FE 之間,尾字節在 40-FE 之間,剔除 xx7F 一條線。總計 23940 個碼位,共收入 21886 個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號 883 個。 這是一個顯示中西文混合字符串的參考程序。通過上面的分析可以得出,如果是漢字,則首字節在81-FE 之間,其最高位爲1,所以補碼小於0,應連續顯示兩個字節;如果是西文字符,則首字節在00-7F之間,其最高位爲0,補碼大於等於0,只需顯示一個字 節。

#include <stdio.h>

char *str="漢字裏有english也能正確顯示,hehe";

int main() {
  int i = 0;
  while (str[i] != '/0') {
    if(str[i] < 0) {
       printf("%c%c/n", str[i], str[i+1]);
       i++;
    }
    else {
      printf("%c/n", str[i]);
    }
    i++;
  }
  return 0;
}

---------------------------------------------------------------------------------------------------------------------

3. 釘子與木板 (30分)

問題背景

 牆上有n個釘子,編號爲1, 2, ..., n。其中釘子i的橫座標爲i,縱座標初始爲xi。可以進行兩種操作:

0 k v:移動操作。豎直移動釘子k,座標變爲(k, v)。

1 s t v:測試操作。若在高度爲v處放一塊橫座標範圍是[s,t]的水平木板,它將下落到什麼高度?換句話說,求出釘子s, s+1, s+2, …, t的縱座標中,不超過v的最大值。如果這些釘子的高度全部大於v,則木板將落到地上,高度爲0。

注意,在測試操作時,水平木板只是用來測試的“臨時木板”,將在測試後立即被拿走,不會影響到後續測試工作。

輸入格式

第一行包含兩個整數n, m,即釘子的個數和操作的個數(1<=n,m<=105)。以下n行每行一個不超過109的非負整數,即xi。以下 m 行爲各操作 (1 <= k <= n, 1 <= s < t <= n, 1 <= v <= 109 )

輸出格式


按照輸入的順序,對於每個測試操作輸出一個整數,即該測試水平木板的最後高度。

樣例輸入

5   4

1

3

5

7

9

1  2  4  6

0  3  10

1  3  5  7

1  3  5  5

樣例輸出

5

7

0

---------------------------------------------------------------------------------------------------------------------------

4. 圓面覆蓋 (40分)

問題背景

在平面上有一個長爲L,寬爲W的長方形,左下角座標爲(0,0),右上角座標爲(L,W)。給定一些圓,第i個圓的圓心座標爲(xi,yi),半徑爲Ri。

你的任務是求最小的正實數k,使得把每個圓的半徑變爲原來的k倍後(即:第i個圓半徑變爲kRi,圓心位置不變),長方形將被這些圓完全覆蓋。換句話說,長方形內部或邊界上的任意點均至少在一個圓的內部或邊界上。

輸入格式

輸入第一行包含三個整數n, L, W(1<=n<=50,1<=L,W<=1000),即圓的個數、長方形的長和寬。

以下n行,每行三個不超過1000的正整數xi, yi和Ri

輸出格式

僅一行,包含一個實數k,保留小數點後三位。

樣例輸入

1 2 2

1 1 1

樣例輸出

1.414

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章