求助关于暴搜时间复杂度(悬一关)
查看原帖
求助关于暴搜时间复杂度(悬一关)
757869
hysbzdkf楼主2024/10/23 20:25

本题我采用了 dfs 的方法来书写但是会 T 第一个点,本机上跑了 16 秒。

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=2000000000;
int n,k,num[101],lon,ans;
set<int>a;
bool cmp(int x,int y){
	return x>y;
}
void dfs(int dep,int now){
//	cout<<dep<<" "<<now<<endl;
	if(dep==n){
		
		if(now!=1){
			if(a.size()<k)
				a.insert(now);
			else{
				if(now<*(--a.end())){
					a.insert(now);
					a.erase(--a.end());
				}
			}
		}			
		
		return ;
	}
	dep++;
	for(int i=now;i<=INF;i*=num[dep])
		dfs(dep,i);
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>num[i];
	sort(num+1,num+1+n);
	dfs(0,1);
	cout<<*(--a.end())<<endl;
	return 0;
}

但是在将排序方式变为从大到小时,通过第一个点的时间为 700ms。

在将排序方式改变后,搜索的数字的总量是不会改变的(是吧),而且在将原做法的 set 操作去掉后原做法依然会跑到 11 秒,请教一下各位大佬为什么

2024/10/23 20:25
加载中...