# Greedy# Array# Conditional Logic

d547 - 4. 秘密(secrets)

🔗 前往 ZeroJudge 原題

題目描述

題目描述了尋找藏寶圖中正確門的過程。給定一個提示密碼(0 和 1 的序列)和多個門上的數字序列,需要找到與提示密碼匹配的門,並輸出該門的數字序列。匹配規則是根據門上數字序列的差值大小關係生成 0 和 1 的序列。

解題思路

程式碼模擬了題目描述的解法。對於每一扇門,從右向左計算一個由 0 和 1 組成的序列。計算規則是比較相鄰兩個數字的差的絕對值與左邊數字的大小,如果差的絕對值大於等於左邊的數字,則為 1,否則為 0。然後,將計算出的序列與提示密碼進行比較。如果兩個序列相同,則輸出該門的數字序列。

複雜度分析

  • 時間複雜度: O(N * M),其中 N 是門的數量,M 是每個數字序列的長度。對於每一扇門,需要遍歷數字序列一次來生成 0 和 1 的序列,然後再遍歷一次來比較序列。
  • 空間複雜度: O(M),主要用於儲存提示密碼、門上的數字序列以及計算出的 0 和 1 的序列。

程式碼

#include <iostream>
using namespace std;
int main(){
	int n,m;
	cin >> n >> m;
	++m;
	bool a[m]={0};
	int b[m];
	for(int i=1;i<m;++i)
		cin >> a[i];
	while(n--){
		for(int i=0;i<m;++i)
			cin >> b[i];
		bool c[m]={0};
		if(b[m-1]>=b[m-2])
			c[m-1]=1;
		for(int i=m-2;i>0;--i){
			int as=abs(b[i]-b[i+1]);
			if(as>=b[i-1])
				c[i]=1;
		}
		bool ans=0;
		for(int i=0;i<m;++i){
			if(a[i]!=c[i]){
				ans=1;
				break;
			}
		}
		if(ans==0){
			for(int i=0;i<m;++i)
				cout << b[i] << " ";
			cout << "\n";
		}
	}
	
}

Discussion