首先就是判重不要用 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;
}