如果使用优先队列并且TLE on #1,可以试试这个方法
查看原帖
如果使用优先队列并且TLE on #1,可以试试这个方法
865625
KobeBeanBryantCox楼主2023/11/12 10:15

首先就是判重不要用 set 或者 map,这两个的时间复杂度是 logn 的,直接在优先队列里判重就行

然后不要全部变量都是用 long long,全部定为 int,改一个变量为 long long 就行了,不然 MLE on #4

最后开个O2就能过了,还蛮快的,两百多毫秒 (这种做法算半个卡常吧)

具体看代码

#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int in()
{
	int k=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
	return k*f;
}
void out(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x<10)putchar(x+'0');
	else out(x/10),putchar(x%10+'0');
}
priority_queue<int,vector<int>,greater<int> >q;
int a[110];
int main()
{
	int k=in(),n=in();
	for(int i=1;i<=k;i++)a[i]=in();
	q.push(1);
	for(int i=1;i<=n;i++)
	{
		int u=q.top();
		while(!q.empty()&&u==q.top())q.pop();
		for(int j=1;j<=k;j++)
		{
			long long t=(long long)(u)*a[j];
			if(t>INT_MAX)break;
			q.push(t);
		}
	}
	cout<<q.top();
	return 0;
}
2023/11/12 10:15
加载中...