# Bit Manipulation# String Processing# Greedy

a467 - 11398 - The Base-1 Number System

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一種特殊的 1 進位數系統,其中數字由 0 的區塊組成,區塊間以空格分隔。區塊中的 0 的數量決定了如何更新一個 flag 變數,並將對應的位數添加到二進位表示中。最終目標是將這種 1 進位數轉換為十進位數。

解題思路

程式碼模擬了 1 進位數系統的轉換過程。它逐個讀取輸入的區塊,根據區塊中 0 的數量更新 ans (二進位表示) 和 flag 變數。如果區塊只有一個 0,則 flag 設為 1;如果區塊有兩個 0,則 flag 設為 0。如果區塊有超過兩個 0,則將 n-2 個 1 添加到二進位表示中。程式碼使用位移運算符 <<+= 來構建二進位數,並在讀取 '#' 時輸出當前的十進位值。

複雜度分析

  • 時間複雜度: O(N),其中 N 是輸入字串的長度。程式碼需要遍歷輸入字串一次。
  • 空間複雜度: O(1)。程式碼只使用了幾個整數變數和一個字串變數,空間使用是常數級別。

程式碼

#include <iostream>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	string a,b;
	int ans=0,flag=0,al=0;
	while(cin >> a){
		if(a=="~")break;
		else if(a=="#"){
			cout << ans << "\n";
			ans=0;
		}
		else{
			al=a.length();
			if(al==1){
				flag=1;
			}
			else if(al==2){
				flag=0;
			}
			else{
				al-=2;
				if(flag){
					while(al--){
						ans<<=1;
						ans+=1;
					}
				}
				else{
					ans<<=al;
				}
			}
		}
	}
}

Discussion