想着应该能二分,试着写了一个代码,没有完全数据,也不知道对不对。
思路是:二分较长的一个数列,因为较长的那个中肯定有数字是中位数或者一部分,二分之后,判断另一个数列需要多少个数,要求的位置就是不小于另一个数列t且不大于t+1,输出即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
#define ll long long int
#define ull unsigned long long int
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define delf int m=(l+r)>>1
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
double find(double a[],int m,double b[],int n)
{
int la=1;
int ra=m;
int s=(m+n)/2+1;
while (la<=ra)
{
int ma=(la+ra)/2;
int t=s-ma;
cout<<la<<" "<<ra<<" "<<t<<endl;
if (t>n)
la=ma+1;
else if (a[ma]<b[t])
la=ma+1;
else if (t<n&&a[ma]>b[t+1])
ra=ma-1;
else
{
if ((m+n)%2==1)
return a[ma];
else
{
if (a[ma-1]>=b[t])
return (a[ma-1]+a[ma])/2;
else
return (b[t]+a[ma])/2;
}
}
}
int ma=la;
int t=s-ma;
if ((m+n)%2==1)
{
if (t<n)
return min(a[ma],b[t+1]);
else
return a[ma];
}
else
{
if (a[ma-1]>=b[t])
return (a[ma-1]+a[ma])/2;
else
return (b[t]+a[ma])/2;
}
}
int main()
{
while (1)
{
double a[100];
double b[100];
int m,n;
cin>>m>>n;
for (int i=1;i<=m;i++)
cin>>a[i];
for (int i=1;i<=n;i++)
cin>>b[i];
sort(a+1,a+m+1);
sort(b+1,b+n+1);
if (m>n)
cout<<find(a,m,b,n)<<endl;
else
cout<<find(b,n,a,m)<<endl;
}
}