a271 - 彩色蘿蔔
題目描述
題目描述了一隻兔子吃不同顏色蘿蔔後體重變化的情境。給定兔子初始體重 m,以及四種蘿蔔對體重影響的數值 x (紅蘿蔔胖), y (白蘿蔔胖), z (黃蘿蔔瘦), w (黑蘿蔔瘦)。黑蘿蔔會導致中毒,每天額外瘦 n。題目給定一串數字,代表兔子吃的蘿蔔序列,要求計算兔子最終的體重。如果體重在任何時刻小於等於 0,則輸出 "bye~Rabbit"。
解題思路
這題的核心是模擬兔子吃蘿蔔的過程。我們需要遍歷蘿蔔序列,根據每個蘿蔔的顏色更新兔子的體重。需要注意的是,黑蘿蔔導致的中毒效果是累加的,並且在當天晚上才生效。因此,我們需要一個變數 p 來記錄中毒的累積影響。如果體重在任何時刻小於等於 0,則立即輸出 "bye~Rabbit" 並結束模擬。
複雜度分析
- 時間複雜度: O(L),其中 L 是蘿蔔序列的長度。因為我們需要遍歷整個蘿蔔序列一次。
- 空間複雜度: O(1),因為我們只使用了幾個常數大小的變數來存儲體重、中毒影響等信息。
程式碼
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
using namespace std;
int main(){
cin.tie(0); ios::sync_with_stdio(false);
int c,x,y,z,w,n,m;
cin >> c;
string a;
while(c--){
cin >> x >> y >> z >> w >> n >> m;
getline(cin,a);
getline(cin,a);
int p=0;
bool die=0;
if(m<=0)die=1;
for(int al=a.length(),i=0;i<al;++i){
if(a[i]!=' '){
m-=p;
if(m<=0)
die=1;
if(a[i]=='1')
m+=x;
else if(a[i]=='2')
m+=y;
else if(a[i]=='3')
m-=z;
else if(a[i]=='4'){
m-=w;
p+=n;
}
if(m<=0)
die=1;
}
}
if(die)
cout << "bye~Rabbit\n";
else
cout << m << "g\n";
}
}