# Brute Force# Sorting

f250 - ugly ++

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算第 n 個醜數。醜數的定義是只能由 2, 3, 5 三個質因數組成的正整數。給定 t 個查詢,每個查詢輸入一個正整數 n,輸出第 n 個醜數。

解題思路

由於 n 的範圍不大 (0 < n <= 10^4),且題目給定的 u[10000] < 10^18 的條件,可以採用暴力法生成所有醜數,然後進行排序,最後根據查詢的 n 值輸出對應的醜數。 生成醜數的方法是通過三重循環,分別遍歷 2, 3, 5 的冪次,將所有可能的醜數生成並存儲在一個數組中。 生成完所有醜數後,使用 sort 函數對數組進行排序。 最後,對於每個查詢,直接從排序後的數組中取出第 n 個元素即可。

複雜度分析

  • 時間複雜度: O(N log N),其中 N 是生成的醜數的數量。三重循環生成醜數的時間複雜度可以近似看作 O(N),排序的時間複雜度為 O(N log N)。
  • 空間複雜度: O(N),用於存儲生成的醜數。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
long long int ans[11001],it,t,n;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	for(long long int i=1;i<1000000000000000000;i*=2){
		for(long long int j=1;i*j<1000000000000000000;j*=3){
			for(long long int k=1;i*j*k<1000000000000000000;k*=5){
				ans[it]=i*j*k;
				++it;
			}
		}
	}
	sort(ans,ans+it);
	cin >> t;
	while(t--){
		cin >> n;
		cout << ans[n-1] << '\n';
	}
}

Discussion