2010年11月8日 星期一

Problem 5(8%):傳統數學問題的解決(99模擬)

子題1:給定若干個數字,將它們依序排成一個頭、尾相接的環形。如果我們從某一數字開
始點名,每次點名後再往後跳2 個數字繼續點名(中間間隔1 個未被點名的數字)。已經被點
到名的數字不可再點,直到剩下最後一個「未點名」的數字時才停止。請問最後的數字為何?
輸入說明:
第1 行依序給定最多20 個要點名的數字,各數字之間以逗號隔開。
第2 行有1 個數字,是「開始點名」的數字。
輸出說明:
第1 行輸出最後一個未點名的數字。
輸入範例:【檔名:in-5-1.txt】
5, 3, 7, 11, 4, 2, 1, 8, 9
8
輸出範例:【檔名:out-5-1.txt】
9
子題2(8%):如果有一個正整數n,其值等於所有n 的因數(除了n 以外)之總合,則n 稱
為「完美數」(Perfect number)。在此計算中,其「因數」不限制為「質因數」。請輸出2 到數
字k 之間的完美數。
輸入說明:
第1 行有1 個數字,代表k 的值。而k 的值不超過50000。
輸出說明:
每行輸出1 個範圍內的完美數,依其值由小到大輸出。
輸入範例:【檔名:in-5-2.txt】
10000
輸出範例:【檔名:out-5-2.txt】
6
28
496
8128

Problem 4:排列組合的應用(99模擬)

子題1(11%):一個菜販有「肉」、「菜」、「蛋」、「果」4 類商品,在菜攤上「分類」排列出
售,各項商品可由輸入檔讀入其「每公斤利潤」。有一天,菜販忘了商品在菜攤的排列方式,
只知道今天各類商品由左至右出售的「公斤數」,其資料選手也可由輸入檔讀入。在不知道今
天商品排列的情況下,請選手將所有的排列方式逐一代入計算,依總利潤之高低順序,由高
而低,輸出所有排列方式及其總利潤。
輸入說明:
第1 行有4 組數字,以逗號隔開,分別表示「肉」、「菜」、「蛋」、「果」每公斤的利潤。
第2 行有4 組數字,以逗號隔開,表示今天菜攤由左至右各類商品出售之公斤數。
輸出說明:
依總利潤之高低順序,每1 行輸出1 組排列方式及其總利潤,資料間至少以1 個空白隔開。
若有總利潤相同者,其前後輸出順序不拘。
輸入範例:【檔名:in-4-1.txt】
70, 32, 18, 42
43, 24, 21, 39
輸出範例:【檔名:out-4-1.txt】
肉菜蛋果 5794
肉蛋菜果 5752
果菜蛋肉 5682
肉果蛋菜 5644
果蛋菜肉 5640
肉蛋果菜 5572
菜果蛋肉 5492
菜蛋果肉 5420
肉果菜蛋 5392
肉菜果蛋 5362
蛋果菜肉 5184
蛋菜果肉 5154
果肉蛋菜 5112
菜肉蛋果 5072
果蛋肉菜 4956
菜蛋肉果 4916
果肉菜蛋 4860
蛋肉菜果 4764
果菜肉蛋 4746
蛋菜肉果 4650
菜肉果蛋 4640
蛋肉果菜 4584
菜果肉蛋 4556
蛋果肉菜 4500


子題2(11%):如果有一個客人來買這個菜攤的n 項商品,每類商品只能買1 項或不買,請
選手列出所有可能的購買組合。輸出之順序,應依照購買之總金額由高而低依序輸出。
輸入說明:
第1 行有1 個數字,代表n 的值。
第2 行有4 組數字,以逗號隔開,分別表示「肉」、「菜」、「蛋」、「果」每項商品的購買金額。
輸出說明:
每列輸出一組購買組合及其購買總金額,並至少以1 個空白隔開。其輸出方式為:每列均輸
出「肉菜蛋果」字串,但客人「購買」之商品名稱以「小括號」括起來。輸出之順序依購買
之總金額由高而低依序輸出,若有總金額相同者則不限順序。
輸入範例:【檔名:in-4-2.txt】
2
140, 64, 36, 84
輸出範例:【檔名:out-4-2.txt】
(肉)菜蛋(果) 224
(肉)(菜)蛋果 204
(肉)菜(蛋)果 176
肉(菜)蛋(果) 148
肉菜(蛋)(果) 120
肉(菜)(蛋)果 100

Problem 3:子字串特徵的判斷(99模擬)

此問題為給定某些英文文句,其內容只有「英文、數字、空白及標點符號」,請選手判斷此文
句是否符合某些檢查條件?
子題1(10%):是否文句中存在任何子字串,其以「任一數字」開頭,「任一數字」結尾,中
間存在1 個至3 個大寫字母。
輸入說明:
第1~3 行表示欲檢查之3 句英文文句。
輸出說明:
第1~3 行分別對應第1~3 句檢查文句,若存在符合條件之子字串即輸出「有」,不存在即輸出
「沒有」。

輸入範例:【檔名:in-3-1.txt】
Tom Lin’s employee number is A123BSC45.
The price is 45 US dollars.
The machine code is 65K2.
輸出範例:【檔名:out-3-1.txt】

沒有

子題2(10%):是否文句中存在任何子字串,其為「合理」的「台北市」、「台中市」或「高
雄市」身份證字號。
註:
(1) 身份證字號第1 碼為地區碼,「台北市」以「A」開頭、「台中市」以「B」開頭、「高雄市」
以「E」開頭。
(2) 身份證字號的第2 碼為「性別」碼,其值應為「1」或「2」。
(3) 若將身份證字號的「地區碼」改為2 碼數字,其中「A」改為「10」、「B」改為「11」、「E」
改為「14」,其後併入原身份證後9 碼數字,成為1 個新的11 位數字碼。將此數字碼由左
至右分別乘以「1、9、8、7、6、5、4、3、2、1、1」,其相乘後的總和應可被10 整除。
輸入說明:
第1~3 行表示欲檢查之文句。
輸出說明:
若存在合理的身份證字號即輸出「有」,不存在即輸出「沒有」。
輸入範例:【檔名:in-3-2.txt】
His ID number is A120441768.
Her ID number is B272857734.
Their ID numbers are E286585485, E282467997, and E195445887.
輸出範例:【檔名:out-3-2.txt】

沒有

Problem 2:資料表示方式的應用(99模擬)

子題1(12%):在一張地圖上標示有若干個城市,及一些可雙向通行的道路。這些道路的頭、
尾,各連接一個不同的城市。我們用1 個一維整數陣列(假設稱為a 陣列),存放各個城市連
接的道路數目(存放順序不限)。為了判斷陣列中存放的道路數目值,是否可以正確的表達某
一張地圖上城市及道路的關係,我們利用以下步驟檢查(假設陣列的指標由1 開始):
步驟1:我們將陣列由大到小排序,令排序後的陣列為b 陣列。
步驟2:假設b(1) = k,我們將b(2)到b(k +1)共k 個元素,每個元素值都減1。
步驟3:我們將b(1)從b 陣列中移除,得一個「新陣列」。
第 3 頁,共 8 頁
步驟4:如果「新陣列」中,存在任何一個小於0 的元素值,原始a 陣列就是「不正確」陣列;
如果「新陣列」中的所有元素均等於0,原始a 陣列就是「正確」陣列。若在此步驟
達成判斷,檢查即可結束。
步驟5:在不能判斷正確與否時,將「新陣列」代入步驟1,重覆上述檢查,直到達成判斷條
件為止。
輸入說明:
第1~4 行表示將判斷之4 組陣列值,各元素間以逗號區隔,每組陣列最多有10 個元素。輸入
檔之元素值,不會造成選手進行「步驟2」時產生「陣列索引值超出範圍」的錯誤。
輸出說明:
第1~4 行分別輸出第1~4 組陣列的正確與否。當正確輸出「正確」,不正確時輸出「不正確」。
輸入範例:【檔名:in-2-1.txt】
1, 1, 2, 5, 3, 2
4, 3, 1, 1, 1
4, 4, 4, 3, 3
3, 3, 3, 3, 3
輸出範例:【檔名:out-2-1.txt】
正確
不正確
正確
不正確


子題2(12%):在圖形結構中,有一種特別的圖形,稱之為「樹狀圖」(Tree)。在一個樹狀
圖中,包含若干個「節點」,每個節點和它的「上一層節點」及「下一層節點」相連。每個節
點有「1 個」或是「沒有」上一層節點;也可能有「1 個」、「多個」或是「沒有」下一層節點。
這些節點中,只有1 個節點沒有上一層節點,所以它是最頂層的節點,我們稱之為「樹根」;
其他「非樹根」的節點,都有1 個上一層節點,我們稱這些「上一層節點」是該節點的「父
親」。現在給定一個樹狀圖資料,並給一個「目的地」節點名稱,請選手輸出從「樹根」連接
到目的地經過的所有節點。輸出資料的順序,應從「樹根」開始,一層一層向下,最後到達
「目的地」節點依序輸出,輸出的節點不能重覆。
輸入說明:第1 行表示共有多少個節點;第2 行是目的地節點;第3 行起是所有節點資料,
每行有一組符號以逗號隔開,第1 個符號為「節點名稱」,第2 個符號為其「父親名稱」。若
是「樹根」節點,其父親表示為「---」3 個連續減號。

輸出說明:列出從「樹根」連接到目的地經過的所有節點(包括樹根與目的地節點),而輸出
的節點間至少以1 個空白相隔開。
輸入範例:【檔名:in-2-2.txt】
11
K
A, ---
B, A
C, A
D, B
E, B
F, C
G, E
H, G
I, G
J, I
K, I
輸出範例:【檔名:out-2-2.txt】
A B E G I K

Problem 1文章的字母統計及單字的分離(99模擬)

Problem 1:文章的字母統計及單字的分離
選手請由輸入檔讀入一篇英文文章(文章內容包括「大、小寫英文」、「空白」及「標點符號」,
沒有任何「全型」字母或符號),並作以下的統計:
子題1(9%): 若不區別英文字母大小寫,請統計26 個英文字母A~Z在文章中出現的次數?
(只統計英文字母,其他如空白、標點符號等皆不統計。)
輸入說明:
第1 行表示文章的行數(行數至多10 行,每行最多120 個字),第2 行開始為文章的內容。
輸出說明:
第1 行分別列出字母A、B、C、D、E 及其統計次數,第2 行列出字母F、G、H、I、J 及其
統計次數,每行輸出5 個字母及統計,以此類推;但最後一行只列出字母Z 及其統計次數。
英文字母以「大寫」輸出,每個字母及其統計次數印在1 組小括號中,並由逗號分隔。
輸入範例:【檔名:in-1-1.txt】
4
Just ask a Chinese fruit farmer who now has to pay people to pollinate apple trees because there are no
longer enough bees to do the job. And it's not just the number of bees that are rapidly dwindling. As a
direct result of human activity, species are becoming extinct at a rate 1,000 times greater than the natural
average.
輸出範例:【檔名:out-1-1.txt】
(A, 27) (B, 6) (C, 7) (D, 6) (E, 38)
(F, 4) (G, 6) (H, 11) (I, 14) (J, 3)
(K, 1) (L, 9) (M, 5) (N, 16) (O, 16)
(P, 8) (Q, 0) (R, 18) (S, 15) (T, 28)
(U, 9) (V, 2) (W, 3) (X, 1) (Y, 3)
(Z, 0)
第 2 頁,共 8 頁

子題2(9%):請列出文章中使用那些「A」或「a」開頭的單字?

輸入說明:
第1 行表示文章的行數(行數至多10 行,每行最多120 個字),第2 行開始為文章的內容。
輸出說明:
依單字在文章中出現之順序,輸出開頭為「A」或「a」的單字。輸出的單字大小寫需保持與
原文章相同,而每行只輸出1 個單字。若同一單字多次出現在文章中,只有該單字在文章中
首次出現時才被輸出,第2 次或以後出現時均不再輸出。
輸入範例:【檔名:in-1-2.txt】
4
Just ask a Chinese fruit farmer who now has to pay people to pollinate apple trees because there are no
longer enough bees to do the job. And it's not just the number of bees that are rapidly dwindling. As a
direct result of human activity, species are becoming extinct at a rate 1,000 times greater than the natural
average.
輸出範例:【檔名:out-1-2.txt】
ask
a
apple
are
And
As
activity
at
average

2010年11月1日 星期一

身分證檢驗

內容 : 正體->简体
我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。

(1) 英文代號以下表轉換成數字

A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 W=32 金門縣
F=15 台北縣 O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣
I=34 嘉義市 R=25 台南縣

(2) 英文轉成的數字, 個位數乘9再加上十位數的數字

(3) 各數字從右到左依次乘1、2、3、4....8

(4) 求出(2),(3) 及最後一碼的和

(5) (4)除10 若整除,則為 real,否則為 fake

例: T112663836

2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180

除以 10 整除,因此為 real

輸入說明 :
一組身分證號碼
輸出說明 :
輸出 real or fake
範例輸入 :

T112663836
S154287863
範例輸出 :

real
fake

奇怪的老闆

內容 : 正體->简体
有一個很古怪的老闆,他有N名員工,每個人有自己的薪水,這個老闆很喜歡去找出編號第A到編號到B之間的最高薪水與最低薪水的差,但是你以為他只找一次嗎?當然不是,他有強迫症,他每隔1秒就隨機寫兩個數字,然後找出這段數字裡最多薪水的錢,並寫下來作成紀錄。

老闆每次都要他的秘書幫他找,他的秘書受不了,想請你幫她寫一個程式讓他可以很迅速的找到,在這區間最高薪水與最低薪水的差是多少錢, 好讓他可以輕鬆一下。

輸入說明 :
第一行有兩個數字N(1 ≤ N ≤ 50,000), Q (1 ≤ Q ≤ 200,000) 代表有N名員工跟Q個問題。

接下來有 N行代表第1~N名的員工薪水。

在接下來的Q行有兩個數字 a,b
"(0 < a < = b < = n)" 代表老闆寫的兩個數字,請你找出這段區間的最高薪水與最低薪水的差。

輸出說明 :
對於每一個問題,印出最高薪水與最低薪水的差為何?並換行。
範例輸入 :

6 3
1
7
3
4
2
5
1 5
4 6
2 2
範例輸出 :

6
3
0

數字合併

內容 : 正體->简体
黑板上有n個數字寫成一排,現在每次選擇兩個相鄰的數字,把比較小的那個 數字擦掉(如果兩個數字一樣大,那麼擦掉任何一個都可以。)然而,這些步驟需要花費,這個花費恰好等於留下來的那個數字(比較大的那個)。

請問經過n-1次操作,黑板上會剩下的那個數字是多少?

你以為問題這麼簡單嗎?錯!

真正的問題是:

請問經過n-1次操作,黑板上會剩下最大的那個數字,所有操作方法中,最小總花費是多少?
輸入說明 :
輸入檔只包含一筆測試資料。
第一列有一個正整數n(1<=n<=1,000,000)代表黑板上數字的個數。
接下來有n列,每列有一個正整數(1<=數字<=109)依序代表黑板上的每個數字。
輸出說明 :
請輸出經過n-1次操作之後,所需的最小總花費。
範例輸入 :
5
7
4
5
2
5
範例輸出 :
22

提示 :
消掉4、花費5;
消掉2、花費5;
消掉5、花費5;
消掉5、花費7;
總花費是5+5+5+7=22。

Colorful Board

內容 : 正體->简体
給你一個板子,在上面M條水平線跟N條垂直線,因此在整個板子有(M+1) x (N+1)格子,現在請你在每個格子上填上顏色,總共有4種顏色Red,Green,Blue,Orange。

為了使板子更加漂亮,你必須小心一件事情,兩鄰的格子不能有相同的顏色(相鄰的定義是有共同的邊),但是有些格子是被禁止塗上任何顏色的,題目來了,你必須回答有幾種方式可以塗完,但不觸犯以上規則。

輸入說明 :
第一個數字T(T<=50)代表有幾組冊資,每一組測資會給兩格數字M,N ( 0 < M , N < = 6 )代表有幾條水平線跟垂直線,下一行但表有幾格被禁止不能圖畫的個數K( 0 < = K < = ( M + 1 ) * ( N + 1 ) ),接下來K行會包含兩個數字X,Y (1<=x<=M+1, 1<=y<=N+1),代表第X行的第Y個是被禁止塗畫。

輸出說明 :
對於每一個測資,請輸出一行 "Case #K: P",K代表第幾組測試資料,P代表有幾種可能,由於答案可能很大,請mod 1000000007

範例輸入 :

2
1 1
1
2 1
0 0
0
範例輸出 :

Case 1: 36
Case 2: 4