# Array# Simulation# Greedy

e568 - 11639 - Guard the Land

🔗 前往 ZeroJudge 原題

題目描述

題目描述了農夫 Latif 的土地,以及兩名守衛各自守護的矩形區域。要求計算強安全區(兩個守衛都守護的區域)、弱安全區(只有一個守衛守護的區域)和非安全區(沒有守衛守護的區域)的面積。

解題思路

此題的核心思路是使用一個陣列來模擬土地上的每個點,並標記每個點被守衛守護的次數。

  1. 建立一個大小為 100x100 的陣列 ans,用於記錄每個點被守護的次數。由於陣列索引只能是非負整數,因此將座標 (x, y) 映射到一個一維索引 x + y * 100
  2. 對於每個守衛的矩形區域,遍歷該區域內的每個點,並將 ans 陣列中對應索引的值加 1。
  3. 遍歷 ans 陣列,統計被守護 2 次(強安全區)、1 次(弱安全區)和 0 次(非安全區)的點的數量。
  4. 計算每個區域的面積,並輸出結果。

複雜度分析

  • 時間複雜度: O(n * w * h),其中 n 是夜晚的數量,w 和 h 分別是土地的寬度和高度 (100)。由於需要遍歷兩個矩形區域,因此時間複雜度為 O(n * 100 * 100)。
  • 空間複雜度: O(w * h),其中 w 和 h 分別是土地的寬度和高度 (100)。空間複雜度主要來自於 ans 陣列,其大小為 100 * 100。

程式碼

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	for(int ca=1;ca<=n;++ca){
		int a[8],ans[10001]={0},x=0,y=0,z=0;
		for(int i=0;i<8;++i){
			cin >> a[i];
		}
		for(int i=a[0];i<a[2];++i){
			for(int j=a[1];j<a[3];++j){
				++ans[i+j*100];
			} 
		}
		for(int i=a[4];i<a[6];++i){
			for(int j=a[5];j<a[7];++j){
				++ans[i+j*100];
			} 
		}
		for(int i=0;i<10000;++i){
			if(ans[i]==2){
				++x;
			}
			else if(ans[i]==1){
				++y;
			}
			else{
				++z;
			}
		}
		cout << "Night " << ca << ": " << x << " " << y << " " << z << "\n"; 
	}
}

Discussion