# String Parsing# Greedy# Simulation

b982 - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入字串解析,並根據字串中包含的單位 (g, m, k, b, by) 計算出一個總和。字串中包含數字和單位,需要正確提取數字並轉換為對應的數值。

解題思路

這題主要是一個字串解析的題目。程式碼透過迴圈迭代輸入字串,判斷每個字元是數字、小數點還是單位。如果是數字,則將其轉換為整數並累加到 buf 變數中。如果是單位,則根據不同的單位將 bufbuf2 轉換為對應的數值,並加到 ans 變數中。buf2 用於處理小數部分。程式碼需要處理多種單位,例如 'g', 'm', 'k', 'b', 'by',並根據單位進行不同的計算。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為程式碼需要遍歷整個輸入字串一次。
  • 空間複雜度: O(1),因為程式碼只使用了幾個整數變數來儲存中間結果,空間使用量不隨輸入字串的長度而變化。

程式碼

#include <iostream>
using namespace std;
string a;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> a){
		long long int al=a.length(),ans=0,buf=0,buf2=0;
		for(int i=0;i<al;++i){
			if(a[i]>='0'&&a[i]<='9'){
				buf *= 10;
				buf += a[i]-'0';
			}
			else if(a[i]!='.'){
				if(a[i]=='g')
					ans += buf * 8000000000;
				else if(a[i]=='m')
					ans += buf * 8000000;
				else if(a[i]=='k')
					ans += buf * 8000 + buf2 * 800;
				else if(a[i]=='b'){
					if(a[i+1]=='y'){
						++i;
						buf *= 8;
					}
					i+=2;
					ans += buf + buf2;
				}
				if(a[i+1]=='b')++i;
				buf = buf2 = 0;
			}
			else buf2 += a[++i]-'0';
		}
		cout << ans << "\n";
	}
}

Discussion