528 - I2P2013 Exam Scoreboard

Time

2014/01/13 10:10:00 2014/01/13 13:10:00

Clarification

# Problem Asker Description Reply Replier Reply Time For all team

# 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

5600 - I2P_mid1_1   

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




5605 - I2P_mid1_2   

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




5610 - I2P_mid1_3   

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:

#include 
int 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




5615 - I2P_mid2_1   

Description

字元群為一串小寫字母( a-z )所組成。
對於兩個字元群,每種字母數目相同就算同個字元群
如 abb 與 bab,視為同字元群,
abb 與 aab,則視為不同字元群。

輸入由字元群組成的句子,
每個字元群間用空白隔開,
請找出該句子中,
出現最多次的字元群
並將次數印出。

hint:
將句子讀進來後,
讓每個字元群輪流當主角,
逐一檢查是否和其他字元群相同。

Input

字元群1 字元群2 ... 字元群N

 

每個字元群由3個字母組成,最多有50個不同的字元群,0<=N<=100

Output

最頻繁出現字元群之出現次數,

若沒有任何字元群則輸出0。

 

註: 最後不須加上換行

Sample Input  Download

Sample Output  Download

Tags




Discuss




5620 - I2P_mid2_2   

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




5625 - I2P_mid2_3   

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




5630 - I2P_mid3_1   

Description

每一個小寫字母可以和對應的一個大寫字母消除
例如一個 a 可以消除一個 A
計算出每個字串經過消除之後
殘餘的未被消除的字母個數
以 bbAABBBaaaC 為例
最後會剩下 BaC
所以答案是 3

Input

第一個正整數 N 代表總共有幾筆資料
接下來每一行是一個字串
字串長度不超過 99 個字元
字串只包含大寫或小寫英文字母

Output

輸出 N 行答案
每一行是一個整數
代表對應的字串中
殘餘的未被消除的字母個數
 

Sample Input  Download

Sample Output  Download

Tags




Discuss




5635 - I2P_mid3_2   

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




5640 - I2P_mid3_3   

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




5645 - I2P_final1   

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




5650 - I2P_final2   

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




5655 - I2P_final3   

Description

輸入:
2
5 3 1 5 9
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 1 2 3 1
 
5 3 1 5 9
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 9 2 3 1
 
輸入資料包含 N 個固定大小 5x5 的二維陣列,每個二維陣列代表可用來放置的棋盤,棋盤格中數字代表分數,其中每個數字皆為0~1000(含)。
 
目標: 找出每個棋盤中分數最高的放置方法,輸出最高能夠得的分數。
 
放置的棋子形狀只有底下這一種,但可以旋轉四個方向。
 
■ ■ ■

 
以上面的輸入來說,每個棋盤分數最高的放置方法分別像底下這樣:
 
5 3 1 5 9
2 3 1 0 2
0 0 1 8 1
1 7 2 8 0
1 1 2 3 1
 
5 3 1 5 9
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

 

註: 最後須換行

Sample Input  Download

Sample Output  Download

Tags




Discuss




5660 - I2P_final4   

Description

讀取一串整數,第一個數字代表有N筆資料,接下來有N筆資料值

例如:
7
2
0
-1
5
5
5
-1

請將資料中出現兩次以上的數字找出來,由小到大輸出


上面的資料應該要輸出

-1
5

註:

1. 資料中一定有出現兩次以上的數字
2. 1 < N < 1000
3. 每筆資料值範圍為[-10000, 10000]

Input

N

資料1

資料2

...

資料N

Output

重複的資料1

重複的資料2

...

 

註: 資料由小排到大且最後須換行

Sample Input  Download

Sample Output  Download

Tags




Discuss