Test Message

b860: 獨角蟲進化計算器

內容

在 Pokémon Go 遊戲中,獨角蟲 (Weedle) 是滿地爬的常見寶可夢。儘管稀有性不足,但是因為它只要 12 顆糖果就可以進化,所以常常被玩家大量補捉並進化,以賺取每次進化所得到的 500 XP 經驗值。

在遊戲中,每補獲一隻獨角蟲可以得到 3 顆糖果,每傳送一隻獨角蟲或是它所進化成的鐵殼蛹 (Kakuna) 給教授可以得到 1 顆糖果,每完成一隻獨角蟲的進化也可以得到一顆糖果。

給你文文目前所擁有的糖果及獨角蟲數量,(假設文文已經把所有的鐵殼蛹或由它再進化而成的大針蜂 (Beedrill)傳送給教授以換取糖果了,而且他會留下足夠的獨角蟲以儘可能進行最多的進化),請你幫他計算一下他現在可以完成幾隻獨角蟲的進化。


輸入

輸入只有一行,含有糖果數量 c (0 ≤ c ≤ 30000)、及所擁有的獨角蟲數量 w (0 ≤ w ≤ 10000)。

19 5

輸出

輸出可進化的獨角蟲數量。

2


解題思路

小麻煩的流程控制,記得在沒糖果的時候還可以拿獨角仙去換。


完整程式碼

AC (2ms, 100KB)
#include <stdio.h>

int main()
{
int candy, weedle, kakuna, count, min;
while (scanf(" %d %d", &candy, &weedle) == 2)
{
kakuna = count = 0;
do
{
min = candy / 12;
if (weedle < min)
min = weedle;
if (min)
{
candy -= 11 * min;
weedle -= min;
kakuna += min;
count += min;
}
candy += kakuna;
kakuna = 0;
if (candy < 12)
{
weedle -= 12 - candy;
candy = 12;
}
} while (weedle > 0);
printf("%d\n", count);
}
return 0;
}

b836: kevin戀愛攻略系列題-2 說好的霸王花呢??

內容

Kevin 暗戀一個女生很久了

他一直不知道他能不能告白成功

於是他開始數花瓣((可憐的花

一開始有 n 個花瓣

而 kevin 第一次拔一個花瓣

接著每次都比上次多拔 m 片

如果最後一次花片剛好拔完沒剩下就算告白成功 輸出 Go Kevin!!

否則輸出 No Stop!!


輸入

有多筆輸入

每一行有兩個數字 n,m

(0 < n <= 2147483647)

(0 <= m <= 2147483647)

9 2

輸出

如果告白成功

輸出 Go Kevin!!

否則輸出 No Stop!!

Go Kevin!!


解題思路

簡單的迴圈 + 四則。

注意花瓣數累加時可能會超過 int 範圍、n 為極大值且 m = 0 會超時。


完整程式碼

AC (2ms, 88KB)
#include <stdio.h>

int main()
{
int n, m;
unsigned int c;
while (scanf(" %d %d", &n, &m) == 2)
{
c = 1;
if (!m)
n = 0;
while (n > 0)
{
n -= c;
c += m;
}
puts(n ? "No Stop!!" : "Go Kevin!!");
}
return 0;
}

b762: 英國聯蒙

內容

隨著時代來到曉責元 6666 年,世界第 87 次戰爭開打了。
而在這次大戰中特別強勢的 國際蘿莉保護王朝 (Expansive National Guardianship Loli Analysis Neighborly Dynasty ,簡稱 ENGLAND)
掌握了相當大部分的勢力,為了與他們的對手沉澱國抗衡,他們這次打算邀請蒙古和他們聯手作戰,然而語言的橫溝(GENERATION GAP)是難以跨越的,
除了將句子重新排序外,我們透過系統統一發出的戰鬥線報可以得知每一個士兵的戰鬥狀況,
系統發出的線報有分成三種:

  1. “Get_Kill” 代表士兵剛剛英勇的殺死了一名敵人
  2. “Get_Assist” 代表士兵機靈的剛剛透過協助別人撿到了一個助攻
  3. “Die” 代表士兵掛了 ORZ
    你的工作就是接收指令,並發送線報回王朝,線報的規則如下:
  4. 若是擊殺了一名敵人,並且連續擊殺( 即擊殺之間沒有死亡 ) 未滿 3 次,則輸出一行”You have slain an enemie.”
  5. 若是連續擊殺累計 3 次,則輸出一行”KILLING SPREE!”
  6. 若是連續擊殺累計 4 次,則輸出一行”RAMPAGE~”
  7. 若是連續擊殺累計 5 次,則輸出一行”UNSTOPPABLE!”
  8. 若是連續擊殺累計 6 次,則輸出一行”DOMINATING!”
  9. 若是連續擊殺累計 7 次,則輸出一行”GUALIKE!”
  10. 若是連續擊殺累計 8 次以上,則輸出一行”LEGENDARY!”
  11. 若是在連續擊殺未滿 3 次時死亡,則輸出一行”You have been slained.”
  12. 若是在連續擊殺累計 3 次以上時死亡,則輸出一行”SHUTDOWN.”

輸入

輸入有兩行,第一行有一數字 N,代表共有 N 條指令 ( N <= 40 )
第 2~N+1 行為指令,保證指令只會有提敘中列舉出的三種

11
Get_Kill
Get_Kill
Get_Assist
Get_Assist
Get_Kill
Die
Get_Kill
Get_Assist
Get_Kill
Die
Get_Kill

輸出

照著國際蘿莉保護王朝的規則輸出線報,並在最後一行輸出士兵目前為止的戰績( 擊殺次數 / 死亡次數 / 助攻次數 )

You have slain an enemie.
You have slain an enemie.
KILLING SPREE!
SHUTDOWN.
You have slain an enemie.
You have slain an enemie.
You have been slained.
You have slain an enemie.
6/2/3


解題思路

簡單的流程處理,因為狀態的字串長度皆不同所以可以用字串長度判斷簡化程式,另外要注意處理連殺 > 8 的情況。

本題原本打算用 gets() 去接字串但範例輸入的第 5 行有奇怪的 Tab 混進去了,不知道作者是想表達裡面有 Tab 或是單純手誤,所以最後改用 scanf(“%s”)


完整程式碼

AC (2ms, 108KB)
#include <stdio.h>
#include <string.h>

char rowKill[][30] = { "", "You have slain an enemie.", "You have slain an enemie.", "KILLING SPREE!",
"RAMPAGE~", "UNSTOPPABLE!", "DOMINATING!", "GUALIKE!", "LEGENDARY!" }, str[15];

int main()
{
int n, act, k, d, a, rk;
while (scanf(" %d", &n) == 1)
{
k = d = a = rk = 0;
for (int i = 0; i < n; i++)
{
scanf(" %s", str);
act = strlen(str);
if (act == 8)
{
k++, rk++;
puts(rowKill[rk < 8 ? rk : 8]);
}
else if (act == 10)
{
a++;
}
else
{
puts(rk < 3 ? "You have been slained." : "SHUTDOWN.");
d++, rk = 0;
}
}
printf("%d/%d/%d\n", k, d, a);
}
return 0;
}

b759: 我明明就有說過= =

內容

烏龜又忘記交代給他的工作了。img1

「我真的記得你沒說過,真的」他辯解道
「喔是喔」瓜瓜說道
「真的啦」他繼續辯解道
雖然解決事情遠遠比辯解來的重要,
但我們還是請了學弟在 N 條字串的對話紀錄中尋找是否出現過交代工作的字串 X (1<=N<=10^5 , 字串總長度<=10^6)
想當然爾,學弟花了 7 分 40 秒就用二分搜和 SET 解決我們的問題了,
沒錯,我們找到了交代工作的字串 X (X 長度<=1000)
「這是在交代工作噢?! 我還以為你只是在打招呼!」
「如果是在交代工作,就應該把問題放前面,要做的是放後面,然後這樣擺..這樣挪..這樣我才看得懂啊!」
為了配合烏龜,我們決定把字串 X 以每個字元當作句首印出來一次,以跨越我們和他之間的代溝(GENERATION GAP)


輸入

輸入只有一行,輸入一字串 X,題目保證字串 X 中只會有大小寫的英文字母

xndrf

輸出

輸出有 N 行

輸出的第 i 行要從 X 字串的第 i 個字元開始輸出到印完整個 X 字串

xndrf
ndrfx
drfxn
rfxnd
fxndr


解題思路

開一個兩倍於限定大小的陣列,用一個指標指向開頭處。

迴圈執行輸入字串的長度次,每次執行迴圈輸出指標字串、將指標指向下一元素,然後將剛才輸出的第一個字元放到字串的末端後進入下一輪,迴圈結束即印出所有答案。


完整程式碼

AC (3ms, 84KB)
#include <stdio.h>
#include <string.h>

char s[2000010];

int main()
{
gets(s);
int len = strlen(s);
for (int i = 0; i < len; i++)
{
puts(s + i);
s[len + i] = s[i];
}
return 0;
}

b758: 牛仔(ㄗˇ)很忙

內容

蛋塔因為上次搞混了講義而感到很愧疚,決定去西部闖蕩一番,他總聽說西部牛仔都會在原野上騎著馬,
但他到了台灣的西部只看到一片繁榮的都市,感到相當困惑,正當他因為招攬不到計程車又沒朋友而哭出來的時候,
一名冷酷的女士將他撿了回去。
女士名叫阿蕙(36),聽了蛋塔的故事後決定讓他暫時留在家裡吃住,阿蕙對蛋塔相當好,讓蛋塔不知不覺間也開始叫他馬麻,
但好景不常,蛋塔犯了一個致命的失誤,差點讓他從家裡被趕出去,
沒錯,就是打擾馬麻的午覺時間,馬麻下午總是在臉上敷上幾根青椒,安穩的睡在沙發上,
要是睡覺時間內的兩個半小時被吵起來,就會發生相當恐怖的事,
現在蛋塔看到馬麻開始休息了,可以告訴他甚麼時候才能把馬麻家的 PS6 打開超大聲玩遊戲嗎?
img1
img2


輸入

輸入只有一行,兩個數字 X、Y,X、Y 以空白區隔,代表現在時間是 X:Y (00:00 ~ 23:59)

9 30

輸出

輸出只有一行,H:M,代表 H:M 才能把馬麻吵醒。

(※記得 H 跟 M 都要印兩位數,如果是個位數的話在前面要補上 0

EX: 2:0 => 02:00)

12:00


解題思路

轉分鐘,加 150 分鐘,再轉回小時+分鐘,注意跨日跟補 0 即可。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>

int main()
{
int h, m;
while (scanf(" %d %d", &h, &m) == 2)
{
m += h * 60 + 150;
h = m / 60, m = m % 60;
printf("%02d:%02d\n", h < 24 ? h : h - 24, m);
}
return 0;
}

b757. 頸美椰子樹

內容

PA 頸美椰子樹
頸美女中是一所追求漂亮脖子的好學校,裡頭的夯夯是一個擁有傲人身材的高二生。

「景美椰子樹,是夯夯的大腿,是夯夯的手臂」

大腿、手臂,雖然都很粗,但在 GOOGLE 地圖上還是能發現其中明顯的差異。
最近夯夯也到了想減肥的花樣年紀了,
假設,大腿半徑瘦下來 R,手臂半徑瘦下來 r,
我們可以立出標準式: R = (r*9)/5 + 32
很巧的,這也是華氏跟攝氏的轉換公式,
剛剛我們正量完夯夯的手臂瘦下了 r 公尺
由於大腿實在太粗了不好測量,想請學弟用程式幫我們算算他的大腿瘦了多少

img1


輸入

輸入只有一行,一個數字 r (0<=r<=100)

※輸入中可能有浮點數

100

49

輸出

輸出 R

212

120.2


解題思路

作者沒給輸出格式,本題要用 %g 輸出

知道是 %g 後就是基本四則的水題。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>

int main()
{
double n;
while (scanf(" %lf", &n) == 1)
{
printf("%g\n", (n * 9) / 5 + 32);
}
return 0;
}

b701: 我的領土有多大

內容

安安國是個島國,有大小不等的小島,身為地政首長的你想要瞭解每個島嶼的面積,以及每個島嶼的極點,如極北、極南、極東、極西。

現在你手上有 0、1 構成的地圖檔,0 代表海洋,1 代表陸地。陸地沒有相連的各視為獨立的小島

有一點點相連的,則視為同一小島

依照土地所在的位置,由北而南、由西而東順序顯示

請完成您的任務。


輸入

前面兩個數字 16 <=X<=512 16 <=Y<=512

分別代表地圖資料的 X 軸及 Y 軸長度

下方的地圖用 0 代表海洋,1 代表陸地。

16 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0
0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0
0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

輸出

每一塊土地輸出五個數字

W N E S A

分別代表極西、極北、極東、極南、面積

依照土地所在的位置,由上而下、由左而右順序顯示

4 2 12 9 36
2 11 4 14 7
9 11 13 13 9


解題思路

用迴圈找到陸地之後就用 DFS 由該地開始遍歷整個島,並將遍歷到的地方都改成海,如此一來於該次遍歷結束後整個島都會變成海,即可避免重複判斷到同一個島。


完整程式碼

AC (2ms, 156KB)
#include <stdio.h>

int map[515][515], x, y, r, l, u, d, a;

void dfs(int y, int x)
{
a++;
map[y][x] = 0;
if (map[y][x - 1])
{
dfs(y, x - 1);
if (l > x - 1)
l = x - 1;
}
if (map[y][x + 1])
{
dfs(y, x + 1);
if (r < x + 1)
r = x + 1;
}
if (map[y + 1][x])
{
dfs(y + 1, x);
if (d < y + 1)
d = y + 1;
}
if (map[y - 1][x])
{
dfs(y - 1, x);
if (u > y - 1)
u = y - 1;
}
}

int main()
{
while (scanf(" %d %d", &x, &y) == 2)
{
for (int i = 1; i <= y; i++)
{
for (int j = 1; j <= x; j++)
scanf(" %d", &map[i][j]);
}
for (int i = 1; i <= y; i++)
{
for (int j = 1; j <= x; j++)
{
if (map[i][j])
{
l = j, u = i, r = j, d = i, a = 0;
map[i][j] = 0;
dfs(i, j);
printf("%d %d %d %d %d\n", l - 1, u - 1, r - 1, d - 1, a);
}
}
}
}
return 0;
}

b680: 百米賽道編排

內容

徑賽短中距離賽跑,皆會依照選手實力進行最佳最公平的分組及賽道,當參賽者眾多的時候,將設置預賽或複賽,分組及賽道編排時必須依循兩個原則:

  1. 實力優秀者,儘量排在中間的賽道。
  2. 實力相當者,絕對避免排在同一組。

分組及賽道編排的的方法如下:

  1. 常態分組:方法是使用 S 型的分配,比如說選手共有 31 人,每 8 人一組(因為每組要 8 個賽道) 。步驟流程可以依照下列的方法實施。

    • 依照個人最佳成績排序。
    • 總人數/8 = 總組數。如 31 / 8 = 4 ,必須分四組。
    • 如分 4 組,每個人的分組依成績排序,設定為 123443211234…..,依照這個規則填滿為止。
  2. 賽道編排:在每個分組上面,成績越好的,越往中間集中。方法就是分組排序號,以 45362718 的順序排賽道。


輸入

  1. 第一個數字 N 代表共有幾位選手,N<= 200 ,且 N 必為 8 的倍數。
  2. 每列有兩項資料,用空白隔開 1 10.80,1 代表選手,80 是他的最佳成績。假設每一位選手的最佳成績不重複。

    16
    1 10.80
    2 10.35
    3 10.02
    4 10.44
    5 11.32
    6 09.93
    7 11.52
    8 11.53
    9 12.34
    10 11.42
    11 10.32
    12 10.28
    13 12.21
    14 12.54
    15 12.26
    16 13.40

輸出

每列共有資料兩個部分,第一個資料代表分組,後面 8 筆資料代表選手所排的賽道順序。如:1 15 10 2 6 11 5 13 16,最前面的 1 代表第一組,15 10 2 6 11 5 13 16 都是選手編號,順序就是賽道的順序,最左邊為第 1 道,最右邊為第 8 道。

1 15 10 2 6 11 5 13 16
2 9 7 4 3 12 1 8 14


解題思路

  1. 按照最佳紀錄排序好由小到大排好

  2. 分組

    • 簡單一點可以用個計數器 12344321 的往陣列丟,輸出時判斷就好但這樣效率不好,要先用一個迴圈分好組、再用兩個迴圈輸出,時間複雜度是 O(n + n²)
    • 也能用數學一點的方式解,觀察規律發現他們會以每兩組數做一個循環,然後循環 4 次,第 1 組出現在每個循環中的頭和尾、2 組在頭 + 1、尾 - 1…,按照這個規律可已讓時間複雜度降至時間複雜度是 O(n)。
  3. 輸出,輸出時按照 45362718 的順序把分好組的選手排入賽道即可。


完整程式碼

AC (2ms, 100KB)
#include <stdio.h>
#include <stdlib.h>
#define MAX 210

typedef struct Node
{
int Num;
double Record;
}Runner;

Runner list[MAX];

int cmp(const Runner* lhs, const Runner* rhs)
{
return lhs->Record > rhs->Record ? 1 : -1;
}

int main()
{
int n, g, g2, g4, g6, g8;
while (scanf(" %d", &n) == 1)
{
for (int i = 1; i <= n; i++)
scanf("%d %lf", &list[i].Num, &list[i].Record);
qsort(list + 1, n, sizeof(Runner), cmp);
g = n >> 3, g2 = g << 1, g4 = g << 2, g6 = g2 + g4, g8 = n;
for (int i = 1; i <= g; i++)
{
printf("%d %d %d %d %d %d %d %d %d\n", i, list[g6 + i].Num, list[g4 + i].Num, list[g2 + i].Num, list[i].Num,
list[g2 + 1 - i].Num, list[g4 + 1 - i].Num, list[g6 + 1 - i].Num, list[g8 + 1 - i].Num);
}
}
return 0;
}

b604: Center of Symmetry

內容

Given a set of n points in a plane with integer coordinates (xi, yi), i = 1, 2, . . . , n. Your task is to decide whether the set of points has a center of symmetry or not.

A set of points S has a center of symmetry if there exists a point s (not necessarily in S) such that for every point p in S there exists a point q in S such that p - s = s - q.

img1


輸入

For each case, the first line contains a number n, 1 <= n <= 10000. The subsequent n

lines contain two integers, which are the x and y coordinates of the point. Every point is unique and -10000000 <= x, y <= 10000000. A line with 0 (n = 0) signifies the end of input. A figure shown below is the sample input.

8
1 10
3 6
6 8
6 2
3 -4
1 0
-2 -2
-2 4
0

輸出

For each set of input data print “yes” if the set of points has a center of symmetry and “no” otherwise.

yes


解題思路

題目大概的意思是 : 給你 n 個點,所有的點是否都有另一個對稱於中心的點存在。

先找出中心點,取所有點至中心點的距離,如果距離有不成對的 (沒有和他一樣的) 情況就代表他沒有對稱於中心的另一個點。

因為沒有要用於計算,距離取曼哈頓距離就行了。


完整程式碼

AC (12ms, 552KB)
#include <stdio.h>
#include <stdlib.h>
#define ABS(x) ((x) < 0 ? -(x) : (x))

typedef struct node
{
double x, y;
}Point;

Point pList[10000];

int cmp(const Point* lhs, const Point* rhs)
{
return lhs->x - rhs->x;
}

int main()
{
int n, pLen;
char allPair;
while (scanf(" %d", &n) == 1 && n)
{
Point midPoint = { 0 };
pLen = 0, allPair = 1;
for (int i = 0; i < n; i++)
{
scanf(" %lf %lf", &pList[pLen].x, &pList[pLen].y);
midPoint.x += pList[pLen].x;
midPoint.y += pList[pLen++].y;
}
midPoint.x /= n, midPoint.y /= n;
for (int i = 0; i < n; i++)
pList[i].x = ABS(pList[i].x - midPoint.x) + ABS(pList[i].y - midPoint.y);
qsort(pList, n, sizeof(Point), cmp);
for (int i = 1; i < n; i += 2)
{
if (pList[i].x != pList[i - 1].x)
{
allPair = 0;
break;
}
}
puts(allPair ? "yes" : "no");
}
return 0;
}

b603: 拋物線方程式

內容

給你頂點與拋物線上一點座標,列出該方程式。例如頂點座標 1 2 線上一點座標 0 5 可以推算出 1y = 3x^2 – 6x + 5
(係數如果是 1 不必省略,每一項係數都為整數,y 項係數為正整數)


輸入

四個整數 x1 y1 x2 y2 前兩個為頂點座標(x1, y1),後兩個為拋物線上一點座標 (x2, y2)

1 2 0 5
1 9 18 60

輸出

輸出 ay = bx^2 + cx + d 的式子,a 為正整數,b, c, d 為整數,a, b, c, d 為 1 時不必省略,等號和加號前後有空白

1y = 3x^2 + -6x + 5
17y = 3x^2 + -6x + 156


解題思路

簡單的數學公式轉程式碼。


完整程式碼

AC (2ms, 100KB)
#include <stdio.h>
#define SWAP(x, y) x^=(y^=(x^=y))

inline int gcd(int m, int n)
{
while (n)
{
m %= n;
SWAP(m, n);
}
return m;
}

int main()
{
int x1, x2, y1, y2, g, a, b, c, d;
while (scanf(" %d %d %d %d", &x1, &x2, &y1, &y2) == 4)
{
a = (y1 - x1) * (y1 - x1);
b = (y2 - x2);
g = gcd(a, b);
b /= g;
a /= g;
c = -2 * b * x1;
d = b * x1 * x1 + a * x2;
printf("%dy = %dx^2 + %dx + %d\n", a, b, c, d);
}
return 0;
}
1171819202127