# Greedy# Simulation# String Processing

a271 - 彩色蘿蔔

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一隻兔子吃不同顏色蘿蔔後體重變化的情境。給定兔子初始體重 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";
	}
}

Discussion