1.暴力枚举,求出所有的数,sort排序,复杂度是O(nm ㏒ nm),大约能过4个点。
2.二分答案,判断有多少小于它的数,如果小于它的数小于k,记录答案,更改l;
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=200100;
ll read()
{
ll res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
res=res*10+ch-'0';
ch=getchar();
}
return res*f;
}
ll a[maxn],b[maxn];
int n,m;
ll l,r,k,ans;
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
cin>>n>>m>>k;
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
sort(a+1,a+n+1);sort(b+1,b+m+1);
l=a[1]*b[1];r=a[n]*b[m];
while(l<=r)
{
ll mid=(l+r)/2;int p=m;
ll num=0;
for(int i=1;i<=n;i++)
{
for(int j=p;j>=1;j--)
{
if(b[j]*a[i]<mid)
{
p=j;num+=j;break;
}
}
if(num>=k)
{
r=mid-1;break;
}
}
if(num<k)
{
l=mid+1;
ans=mid;
}
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}