| # | Problem | Pass Rate (passed user / total user) |
|---|---|---|
| 5600 | I2P_mid1_1 |
|
| 5605 | I2P_mid1_2 |
|
| 5610 | I2P_mid1_3 |
|
| 5615 | I2P_mid2_1 |
|
| 5620 | I2P_mid2_2 |
|
| 5625 | I2P_mid2_3 |
|
| 5630 | I2P_mid3_1 |
|
| 5635 | I2P_mid3_2 |
|
| 5640 | I2P_mid3_3 |
|
| 5645 | I2P_final1 |
|
| 5650 | I2P_final2 |
|
| 5655 | I2P_final3 |
|
| 5660 | I2P_final4 |
|
Description
輸入一個不超過九位數的數字,但是其中有一個數字是問號,你的程式要自動判斷出問號所在的位數應該填入甚麼數字,可以使得整個數目能夠被 7 整除。
注意:
(a) 輸入是用字串的方式讀取,input 陣列中的元素是字元,要記得先轉換成整數值。
(b) 把 ? 所在的位數分別用 0 到 9 的數字去代入並轉換成整數值,譬如 2?,就要依序試過 20, 21, 22, …, 29,然後把其中能夠被 7 整除的數值 21 和 28,用 printf 以 %d 格式依序輸出。
Hint:
#include#include int main(void) { char input[10]; scanf("%9s", input); /* your code */ return 0; }
Input
不超過9位數的非負整數
其中一個數字是問號
Output
將問號填入數字後能被7整除的非負整數
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入一段大寫的英文字串 (假設長度不超過 50 個字元)。照順序輸出每個字母出現的「最左位置」以及「最右位置」。
注意:
(a) 把 ‘A’ 到 ‘Z’ 的大寫字母跑過一遍,用一個變數 found 記錄字母是否曾出現,並記住出現的位置。第一次出現的時候就可以輸出當時的字母以及位置,接下來如果繼續出現相同字母,只需要更新出現位置,但是暫時不用輸出,等到整個字串檢查完畢,再輸出最後記住的位置。
(b) 另一種做法是從字串的開頭開始向右找一次,然後再從字串結尾反向找一次。
Hint:
#include#include int main(void) { char input[51]; scanf("%50s", input); /* your code */ return 0; }
Input
一串大寫的英文字串(長度最多不超過50字元, 最少1字元)
Output
原字串中每個字母的最左位置與最右位置
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入一個 3x3 二維陣列代表地圖,其中包含 1 到 9 的數字,例如
1 4 5
2 3 6
9 8 7
數字標示走訪的順序,從數字 1 的位置開始走,只能往上下左右 (U,D,L,R) 四個方向移動,然後依序走到 2, 3, 4, … 的位置,直到走不下去為止。你的程式要輸出每次的移動方向。以這個例子來說,輸出會是
*DRURDDLL
其中 * 代表開始,D 代表先往下走 (從1走到2),接下來 R 代表往右走 (從2走到3),再接下來 U 代表向上走 (從3走到4),以此類推,直到走到 9 或是走不下去為止。
底下的例子,1 的位置在正中間,走到 7 就停了:
Input:
8 2 3
9 1 4
7 6 5
Output:
*URDDLL
下面的例子從一開始就走不下去:
Input:
8 1 3
6 5 4
7 9 2
Output:
*
注意:
(a) 二維陣列 map 故意開成 5x5 的大小,這樣處理邊界條件比較方便。此外, map 是 global (放在 main 外面),因此程式一開始執行的時候,map 的元素都會自動被清為 0。
Hint:
#includeint map[5][5]; int main(void) { int i, j; for (i=1; i<=3; i++) { for (j=1; j<=3; j++) { scanf("%d", &map[i][j]); } } printf("*"); /* your code */ printf("\n"); return 0; }
Input
由不重複的正整數1到9所組成的3x3地圖
Output
每次移動方向所形成的字串, 並以*為字串的起始字元
Sample Input Download
Sample Output Download
Tags
Discuss
Description
對於兩個字元群,每種字母數目相同就算同個字元群,
如 abb 與 bab,視為同字元群,
輸入由字元群組成的句子,
每個字元群間用空白隔開,
請找出該句子中,
出現最多次的字元群,
並將次數印出。
hint:
Input
字元群1 字元群2 ... 字元群N
每個字元群由3個字母組成,最多有50個不同的字元群,0<=N<=100
Output
最頻繁出現字元群之出現次數,
若沒有任何字元群則輸出0。
註: 最後不須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
假設有一項數為n之多項式( 0 < n < 1000)
f(x) = A1xa1 + A2xa2 + A3xa3 + ... + Anxan
其中對於所有的 i , Ai 為整數, ai 為非負整數(可能重複)
並且 Ai 介於 -100 ~ 100, ai 介於 0 ~ 231 - 1
請將 f(x) 化簡成次方由小排到大的型式
範例一
f(x) = 3x2 + 1+ 5x123123 + x + x - 3x2 + 2x
最後簡化為
f(x) = 1 + 4x + 5x123123
範例二
f(x) = x2 + 0x10 + 0x0 - x2
最後簡化為
f(x) = 0
hint:
底下是 bubble sort 的 pseudocode, 會將n個元素的陣列A由小排到大
function bubblesort ( A, n ) {
var int i, j;
for i from n-1 downto 0 {
for j from 0 to i-1 {
if ( A[j] > A[j+1] ) {
swap( A[j], A[j+1] )
}
}
}
}
Input
n
Ai ai
Output
係數 次方
係數 次方
...
或
0
依據次方由小排到大, 若化簡結果為 f(x) = 0 則輸出 0
注意最後一行須換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
已知西洋棋規則中
騎士一共有如下圖的八種走法

給定兩個 8 x 8 棋盤上的點 (X1, Y1)、(X2, Y2)
請算出騎士從 (X1, Y1) 最少需要走幾步可以到 (X2, Y2)
註:
1. (X1, Y1) 一定走得到 (X2, Y2)
2. 從 (X1, Y1) 走到下一個點才算第一步,(X1, Y1) 自己本身不是第一步
hint:
#include#define INF 2147483647 #define SIZE 8 /* 騎士的八種走法 每一列代表一種走法 x 和 y 的位移量 */ int Move[8][2] = { 1, -2, 2, -1, 2, 1, 1, 2, -1, 2, -2, 1, -2, -1, -1, -2 }; int X1, Y1; int X2, Y2; int min; int valid(int board[SIZE][SIZE], int x, int y, int path); void knightMove(int board[SIZE][SIZE], int x, int y, int step); int main() { /* board 記錄每一格走過了沒 */ int board[SIZE][SIZE] = {0}; while (scanf("%d %d %d %d", &X1, &Y1, &X2, &Y2) != EOF) { min = INF; if (X1==X2 && Y1==Y2) { printf("0\n"); } else { /* 注意!!! board內的順序為Y、X */ board[Y1][X1] = 1; knightMove(board, X1, Y1, 1); board[Y1][X1] = 0; printf("%d\n", min); } } return 0; } /* 判斷是否超出棋盤、是否已經走過 path 代表是第幾種走法 */ int valid(int board[SIZE][SIZE], int x, int y, int path) { int next_x, next_y; next_x = x + Move[path][0]; next_y = y + Move[path][1]; /* ??? */ } /* 傳入騎士現在的位置以及要尋找的是第幾步 */ void knightMove(int board[SIZE][SIZE], int x, int y, int step) { int next_x, next_y; int i; if (step >= min) { return; } for (i = 0; i < 8; ++i) { if (valid(board, x, y, i) == 1) { /* ??? */ } } }
Input
X1(1) Y1(1) X2(1) Y2(1)
X1(2) Y1(2) X2(2) Y2(2)
...
X1(N) Y1(N) X2(N) Y2(N)
註: 0 <= X1(i), Y1(i), X2(i), Y2(i) < 8 , for i=1, 2, ... , N
N為不超過20的正整數
Output
步數1
步數2
...
步數N
註: 最後須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
有一 M by N 的整數矩陣 A ( 1 <= M <= 10, 1 <= N <= 10)
假設給 K 個 entry 的位置(不重複), (1 <= K <= M*N)
請算出
1. 這些位置上數值的總和P
2. 不在這些位置上數值的總和Q
例如 M = 2, N = 4, A 的內容為
10 20 30 40
50 60 70 80
K = 3, entry 為
1 2
2 4
2 1
因為A(1,2) + A(2, 4) + A(2, 1) = 20+80+50 = 150
並且A(1,1) + A(1,3) + A(1,4) + A(2,2) + A(2,3) = 10 + 30 + 40 + 60 + 70 = 210
最後輸出
150 210
Input
M N
A
K
entry1
entry2
...
entryk
Output
P Q
註: 不需換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
有一座五層的數字塔,第一層有 1 個數字,第二層有 2 個數字,以此類推
整座塔呈現三角形,每個數字只和下一個距離最近的兩個數字有樓梯連結
而且只能往下走,如下圖:
1
4 6
6 9 3
6 3 7 1
2 6 3 1 8
第二層的 4 只可以走到第三層的 6、9
第二層的 6 只可以走到第三層的 9、3
從第一層開始往下走
要如何從第一層走到最底層
使得經過的值加起來最大
將最大值輸出
註:
數字塔會包含 0
0 代表死路不能走
也就是路徑不能經過 0
但一定有至少一條路徑可以從第一層走到最底層
hint:
#include#define NINF -2147483648 #define SIZE 5 int max; /* 傳入即將進入第幾層、第幾個位置以及目前為止的加總 */ void goThroughTower(int tower[SIZE][SIZE], int level, int index, int sum) { if (level + 1 == SIZE) { /* ??? */ } else { /* ??? */ } } int main() { int tower[SIZE][SIZE]; int i, j; while (scanf("%d", &tower[0][0]) != EOF) { max = NINF; for (i = 1; i < SIZE; ++i) { for (j = 0; j <= i; ++j) scanf("%d", &tower[i][j]); } goThroughTower(tower, 0, 0, 0); printf("%d\n", max); } return 0; }
Input
塔1
...
塔N
註: 塔內的數均為 1~231-1 的正整數
N 為小於20的正整數
Output
最大值1
...
最大值N
註: 最後須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入資料
8
I 10
I 15
I -20
I 5
I 30
F
S
F
第一個數字 N 代表總共有幾個指令 (上面的例子 N=8)
I 代表 insert, 同時在頭尾各加入一個 node, 因此 list 會多出兩個 node
加在頭的整數如果是 X, 則加在尾的整數是 -X
F 輸出 list 的第一個 node 以及最後一個 node 的資料內容, 並且將它們從 list 移除
S 將 list 從中間切斷 然後對調, list 長度不變, 但是內容會對調
上面的例子
做完每個動作之後
list 的內部變化如下
I 10: (10, -10)
I 15: (15, 10, -10, -15)
I -20: (-20, 15, 10, -10, -15, 20)
I 5 : (5, -20, 15, 10, -10, -15, 20, -5)
I 30: (30, 5, -20, 15, 10, -10, -15, 20, -5, -30)
F : (5, -20, 15, 10, -10, -15, 20, -5)
S : (-10, -15, 20, -5, 5, -20, 15, 10)
F : (-15, 20, -5, 5, -20, 15)
程式應該要輸出
30 -30
-10 10
[提示]
兩個 doubly linked lists
DL_List *d1, *d2, *tmp;
d1 負責前半段
d2 負責後半段
遇到 I X 指令
d1 用 insertBeginning 加入 X
d2 用 insertEnd 加入 -X
遇到 F 指令
d1 輸出 firstNode 的資料並且將 firstNode 移除
d2 輸出 lastNode 的資料並且將 lastNode 移除
遇到 S 指令
交換 d1, d2
以下檔案為 Doubly Linked List 的程式碼提供參考
dl_list.zip
Input
N
指令1
指令2
...
指令N
0 < N <100
Output
每次碰到 F 指令時
list 內的頭、尾數分別是多少
將頭、尾數以空白隔開印出
註:
碰到 F 和 S 指令時,list 內至少都會有2個數
input 中至少會有一個 F 指令
最後須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入資料格式如下:
第一個數字 N 是資料數量
每一筆資料都包含 name 和 price
名稱都是小寫英文字母
長度不超過 10 個字元
價格都是浮點數
最後請將資料依照指定方式排序後印出
以下檔案為 qsort 的程式碼提供參考
qsort_example.zip
Input
N
Name1 Price1
Name2 Price2
Name3 Price3
‧
‧
‧
NameN PriceN
Output
將資料依照價格
從低價到高價排序
如果價格相同
則將名稱從小到大排序 (a-z)
注意,浮點數請顯示小數點後六位
Sample Input Download
Sample Output Download
Tags
Discuss
Description
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 1 2 3 1
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 9 2 3 1
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 1 2 3 1
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 9 2 3 1
25
26
Input
N
二維陣列1
二維陣列1
...
二維陣列N
Output
最高分數1
最高分數2
...
最高分數N
註: 最後須換行