cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
bool flag[N];
void solve()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
sort(a,a+n);
sort(b,b+m);
// for(int i=0;i<n;i++)
// cout<<a[i]<<" ";
// cout<<endl;
// for(int i=0;i<m;i++)
// cout<<b[i]<<" ";
// cout<<endl;
int ans=0;
int i=0,j=m-1;
// for(int k=0;k<n;k++)
// {
// int x=b[i];
// int y=b[j];
//
// x=abs(x-a[k]);
// y=abs(y-a[k]);
//
// if(x>y&&i<=m-1&&flag[i]==false)
// {
cout<<i<<endl;
// flag[i]=true;
// i++;
// ans+=x;
// }
// else if(x<=y&&j>=0&&flag[j]==false)
// {
// flag[j]=true;
// j--;
// ans+=y;
// }
// }
// for(int p=0,q=n-1;p<=n-1&&q>=0;p++,q--)
// {
// int x=abs(a[p]-b[j]);
// int y=abs(a[q]-b[i]);
//
// if(x>y&&flag[j]==false&&j>=0)
// {
// flag[j]=true;
// j--;
// ans+=x;
// }
// else if(x<=y&&flag[i]==false&&i<=m-1)
// {
// flag[i]=true;
// i++;
// ans+=y;
// }
// }
// int cnt=0;
// for(int k=0;k<n&&cnt<n;k++)
// {
// int a1=abs(a[k]-b[i]);
// int a2=abs(a[n-1-k]-b[i]);
// int a3=abs(a[k]-b[j]);
// int a4=abs(a[n-1-k]-b[j]);
//
// if(a1>=a2&&a1>=a3&&a1>=a4&&flag[i]==false&&flag_a[k]==false&&i<=n-1)
// {
// flag[i]=true;
// flag_a[k]=true;
// i++;
// ans+=a1;
// cnt++;
// }
// else if(a2>=a1&&a2>=a3&&a2>=a4&&flag[i]==false&&flag_a[n-1-k]==false&&i<=n-1)
// {
// flag[i]=true;
// flag_a[n-1-k]=true;
// i++;
// ans+=a2;
// cnt++;
// }
// else if(a3>=a1&&a3>=a2&&a3>=a4&&flag[j]==false&&flag_a[k]==false&&j>=0)
// {
// flag[j]=true;
// flag_a[k]=true;
// j--;
// ans+=a3;
// cnt++;
// }
// else if(a4>=a1&&a4>=a2&&a4>=a3&&flag[j]==false&&flag_a[n-1-k]==false&&j>=0)
// {
// flag[j]=true;
// flag_a[n-1-k]=true;
// j--;
// ans+=a4;
// cnt++;
// }
// }
int p=0,q=n-1;
while(p!=q)
{
int a1=abs(a[p]-b[i]);
int a2=abs(a[q]-b[i]);
int a3=abs(a[p]-b[j]);
int a4=abs(a[q]-b[j]);
if(a1>=a2&&a1>=a3&&a1>=a4&&flag[i]==false)
{
flag[i]=true;
i++;
ans+=a1;
p++;
}
else if(a2>=a1&&a2>=a3&&a2>=a4&&flag[i]==false)
{
flag[i]=true;
i++;
ans+=a2;
q--;
}
else if(a3>=a1&&a3>=a2&&a3>=a4&&flag[j]==false)
{
flag[j]=true;
j--;
ans+=a3;
p++;
}
else if(a4>=a1&&a4>=a2&&a4>=a3&&flag[j]==false)
{
flag[j]=true;
j--;
ans+=a4;
q--;
}
}
cout<<ans<<endl;
memset(flag,false,sizeof flag);
// memset(flag_a,false,sizeof flag_a);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
尝试了几个版本的双指针,都无法通过第一个样例
思路是给两个数组排序,然后给两个数组使用双指针,贪心策略维护最大值,累加贡献,最后输出答案
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
void solve()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
sort(a,a+n);
sort(b,b+m);
long long ans=0;
int al=0,ar=n-1,bl=0,br=m-1;
while(al<=ar&&bl<=br)
{
int a1=abs(a[al]-b[bl]);
int a2=abs(a[ar]-b[bl]);
int a3=abs(a[al]-b[br]);
int a4=abs(a[ar]-b[br]);
int temp=max({a1,a2,a3,a4});
ans+=temp;
if(temp==a1)
al++,bl++;
else if(temp==a2)
ar--,bl++;
else if(temp==a3)
al++,br--;
else if(temp==a4)
ar--,br--;
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--)
solve();
return 0;
}
还是这个思路,简化了一下过了
思路其实应该是可以了,主要是代码的一些细节没有处理好,像下面那样写就可以了
注意答案的数据范围比较大,需要使用 long long