[STL]洛谷 P2527 [SHOI2001] Panda的烦恼 题解

也是通过这题才完整的了解了一下 STL 里 set 的用法。

基本就是模拟题意,然后通过 set 的有序性保证复杂度是 \(O(nk)\) 的。

你每次都把当前最小的元素拿出来,和给你的质因数乘。显然,这样能保证后面进入集合的元素一定是大于目前的元素的。所以你就只需要在目前的这些元素里扔一个就好了。

一共扔 \(k\) 次。然后就是一个小优化,如果你集合里已经有了大于 \(k\) 个元素,一个大于此时最大元素的值很显然不可能成为答案,就没必要进入集合了,直接剪掉。

#include <bits/stdc++.h>
#define int long long
using namespace std;
set<int> s;
constexpr int N = 105;
int n , k , a[N] , mx;
namespace Main {
	static inline void _() {
		ios :: sync_with_stdio(NULL) , cin.tie(NULL) , cout.tie(NULL);
		cin >> n >> k; 	s.insert(1); 	mx = 1;
		for(register int i = 1; i <= n; ++i) {
			cin >> a[i];
		}
		for(register int time = 1; time <= k; ++time) {
			for(register int i = 1; i <= n; ++i) {
				if((s.size() > k && *s.begin() * a[i] < mx) || (s.size() <= k)) {
					s.insert(*s.begin() * a[i]);
					mx = max(mx , *s.begin() * a[i]);
				}
			}
			s.erase(s.begin());
		}
		cout << *s.begin();
	}
}
signed main() {Main :: _(); return 0;}
posted @ 2025-04-20 16:25  「癔症」  阅读(25)  评论(0)    收藏  举报