題目敘述
每筆輸入第一行有一個正整數N,接下來會有N筆資料,每一組資料低一行會有6個正整數:x、y、z、w、n、m。
紅蘿蔔吃了胖x公克,白蘿蔔吃了胖y公克,黃蘿蔔吃了瘦z公克,發霉的蘿蔔吃了瘦w公克(附加狀態:中毒)
中毒會使兔子每天瘦ng(中毒當天不算),且中毒狀態可累加,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
範例輸出
1g
bye~Rabbit
bye~Rabbit
bye~Rabbit
解題思路
使用字串的方式將每筆資料的第二行存起來。接下來可以使用For迴圈將不是空白的字元存到一個陣列裡 (因第二行的整數只會有個位數)。之後再使用For迴圈來做判斷兔子體重的增減。更高階的方式可以使用StringStream來進行解題。要注意的是,一開始cin完6個整數之後要先做一次沒有意義的getline不然getline會失效這點要注意,或者是使用cin.ignore()也可以。為了避免TLE,在做體重增減判斷時,如果已經發現兔子的體重小於0,可以直接把For迴圈break掉,然後使用布林值來判斷是否要輸出兔子當前的體重。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <string>
using namespace std;
int main() {
int N;
int red, white, yellow, black, poison, current;
cin >> N;
string str;
for (int i = 0; i<N; i++)
{
cin >> red >> white >> yellow >> black >> poison >> current;
getline(cin , str);
getline(cin, str);
int carrots[10000] = {};
int tmp = 0;
int count = 0;
bool dead = false;
for (int j = 0; j<str.length(); j++)
{
if (str[j] != ' ')
{
carrots[tmp] = str[j] - '0';
tmp += 1;
}
}
for (int i = 0; i<tmp; i++)
{
current -= count * poison;
if (current <= 0)
{
cout << "bye~Rabbit" << endl;
dead = true;
break;
}
if (carrots[i] == 1)
{
current += red;
}
else if (carrots[i] == 2)
{
current += white;
}
else if (carrots[i] == 3)
{
current -= yellow;
}
else if (carrots[i] == 4)
{
current -= black;
count += 1;
}
if (current <= 0)
{
cout << "bye~Rabbit" << endl;
dead = true;
break;
}
}
if (!dead)
{
cout << current << "g" << endl;
}
}
}
留言
張貼留言