# Array# Greedy# Iteration

e796 - p3. 站牌廣告

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算公車路線上每個站牌的人流量,並找出人流量最少和最多的站牌編號。輸入包含站牌總數 B 和乘客數量 P。接下來 P 行,每行包含兩個數字 XY,表示一位乘客的上車站牌和下車站牌。

解題思路

本題的核心思路是使用一個陣列 a 來記錄每個站牌的人流量。遍歷所有乘客的上下車資訊,對於每位乘客,將其上車站牌和下車站牌之間(包含上下車站牌)的所有站牌的人流量加 1。然後,遍歷 a 陣列,找出人流量的最小值和最大值,並記錄對應的站牌編號。最後,輸出人流量最少的站牌編號和人流量最多的站牌編號。如果有多個站牌具有相同的人流量,則輸出編號最小的(最少人流)和最大的(最多人流)。

複雜度分析

  • 時間複雜度: O(B * P + B) 其中 B 是站牌數量,P 是乘客數量。遍歷乘客資訊需要 O(B * P) 的時間,遍歷站牌陣列找出最大最小值需要 O(B) 的時間。
  • 空間複雜度: O(B) 需要一個大小為 B+1 的陣列 a 來儲存每個站牌的人流量。

程式碼

#include <stdio.h>
int main(){
	int b,p,x,y;
	scanf("%d%d",&b,&p);
	int a[b+1],max=0,min=1000;
	for(int i=0;i<=b;i++)
		a[i]=0;
	while(p--){
		scanf("%d%d",&x,&y);
		if(y<x){
			x^=y;
			y^=x;
			x^=y;
		}
		for(int i=x;i<=y;i++)
			a[i]++;
	}
	for(int i=1;i<=b;i++){
		if(a[i]>max)
			max=a[i];
		if(a[i]<min)
			min=a[i];
	}
	for(int i=1;i<=b;i++){
		if(a[i]==min){
			printf("%d ",i);
			break;
		}
	}
	for(int i=b;i>=0;i--){
		if(a[i]==max){
			printf("%d",i);
			break;
		}
	}
}

Discussion