# Greedy# Simulation# Array

b944 - 好想上廁所(男廁篇)

🔗 前往 ZeroJudge 原題

題目描述

題目描述了男生使用廁所的習慣,他們會盡量選擇相隔一個小便斗,如果找不到則使用相鄰的。程式需要模擬這個過程,並輸出每個小便斗的使用者編號和剩餘時間。

解題思路

這題的核心是模擬廁所的使用情況。程式使用一個陣列 a[25][2] 來記錄每個小便斗的使用者編號 (a[i][0]) 和剩餘時間 (a[i][1])。對於每個新來的男生,程式會從小便斗 1 開始尋找空閒的。優先選擇相隔一個小便斗的空位,如果找不到,則選擇相鄰的空位。如果所有小便斗都已滿,則輸出 "Not enough"。每次找到空位後,更新小便斗的使用者編號和剩餘時間,並減少已使用小便斗的剩餘時間。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是小便斗的數量。在最壞情況下,程式需要遍歷所有小便斗來尋找空位。
  • 空間複雜度: O(n),程式使用一個大小為 n 的陣列來儲存小便斗的資訊。

程式碼

#include <iostream>
using namespace std;
int a[25][2],n,b,t;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n;
	while(cin >> b >> t){
		for(int i=1;i<=n;++i){
			if(a[i][0]){
				a[i][1]--;
				if(a[i][1]<=0){
					a[i][0]=a[i][1]=0;
				}
			}
		}
		int ac=1;
		for(int i=1;i<=n&&ac;++i){
			if(a[i][0]==0&&a[i-1][0]==0&&a[i+1][0]==0){
				ac=0;
				a[i][0]=b;
				a[i][1]=t;
			}
		}
		for(int i=1;i<=n&&ac;++i){
			if(a[i][0]==0){
				ac=0;
				a[i][0]=b;
				a[i][1]=t;
			}
		}
		if(ac){
			cout << "  Not enough\n";
		}
		cout << "Number: ";
		for(int i=1;i<=n;++i){
			cout << a[i][0] << " ";
		}
		cout << "\n  Time: ";
		for(int i=1;i<=n;++i){
			cout << a[i][1] << " ";
		}
		cout << "\n";
	}
	
}

Discussion