Test Message

a271: 彩色蘿蔔

內容

在一個神奇的國度裡,有一種兔子,它只吃蘿蔔,且每天只吃一個,蘿蔔有四種顏色,分別為:紅蘿蔔,白蘿蔔,黃蘿蔔,發霉的蘿蔔(黑色),兔子吃了蘿蔔之後,體重會有不同的變化,紅蘿蔔吃了胖 xg,白蘿蔔吃了胖 yg,黃蘿蔔吃了瘦 zg(醃黃蘿蔔真難吃…),發霉的蘿蔔吃了瘦 wg(附加狀態:中毒…),現在給你 x,y,z,w 問你幾天後,兔子的體重!

p.s.中毒會使兔子每天瘦 ng(中毒當天不算),且中毒狀態可累加,m 是兔子初始的體重。早上先中毒,晚上才吃東西。

上面的敘述很重要,要仔細看!


輸入

第一行是測資的筆數,每筆測資第一行是 x,y,z,w,n,m,第二行是一串數字,1 代表紅蘿蔔,2 代表白蘿蔔,3 代表黃蘿蔔,4 代表黑蘿蔔,0 代表沒吃。這一行中的數字為兔子這段時間內所吃的食物。

4
5 3 2 4 3 10
1 1 2 3 3 3 3 4 3 3
5 3 2 4 3 10
1 1 2 3 3 3 3 4 3 3 2 2 2 2 2 2 2
5 3 2 4 3 10
4 1 3 3 1 1 2 2 1 1 3 1 1 1 1 4
10 3 2 2 1 5
1 4 4 0 0 4 1 2 2 2 0 0 2 2 0

輸出

請輸出兔子在那段時間後所剩的體重,如果體重有在任意時刻少於等於 0 請輸出:”bye~Rabbit”(不含引號),不然請印出結束時的體重。(詳情參照範例輸入輸出)

有可能問你第一天的體重歐!(就是問初始體重,也就是那行根本沒輸入)
例如如:
13 312 43 432 567
//空一行

輸出為:567

1g
bye~Rabbit
bye~Rabbit
bye~Rabbit


解題思路


完整程式碼

簡單的流程控制和字串處理。

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

int kase, x, y, z, w, n, m, nt, r;
char buffer[1000], * curr;

inline char* sgetInt(char* src, int* dst)
{
*dst = 0;
int i = 0, getNum = 0;
for (; src[i]; i++)
{
if (src[i] >= '0' && src[i] <= '9')
* dst = (*dst << 3) + (*dst << 1) + (src[i] - '0'), getNum = 1;
else if (getNum)
return src + i + 1;
}
return getNum ? src + i : NULL;
}

int main()
{
scanf("%d", &kase);
getchar();
while (kase--)
{
gets(buffer), curr = buffer;
curr = sgetInt(curr, &x), curr = sgetInt(curr, &y), curr = sgetInt(curr, &z);
curr = sgetInt(curr, &w), curr = sgetInt(curr, &n), curr = sgetInt(curr, &m);
gets(buffer), curr = buffer, nt = 0;
while ((curr = sgetInt(curr, &r)) != NULL)
{
if ((m -= nt) <= 0)
break;
switch (r)
{
case 1:
m += x;
break;
case 2:
m += y;
break;
case 3:
m -= z;
break;
case 4:
m -= w, nt += n;
break;
default:
break;
}
}
m > 0 ? printf("%dg\n", m) : puts("bye~Rabbit");
}
return 0;
}