双指针_贪心_1921_D. Very Different Array

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

相关推荐
10001hours20 小时前
初阶数据结构.1.顺序表.通讯录项目(只有源码和注释)
数据结构·算法
Emilia486.1 天前
八大排序算法
算法·排序算法
blammmp1 天前
算法专题十九:记忆化搜索(暴搜->记忆化搜索)
算法·深度优先·记忆化搜索
纵有疾風起1 天前
C++—string(1):string类的学习与使用
开发语言·c++·经验分享·学习·开源·1024程序员节
MicroTech20251 天前
边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
科技·算法·ai
王哈哈^_^1 天前
【数据集】【YOLO】目标检测游泳数据集 4481 张,溺水数据集,YOLO河道、海滩游泳识别算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·分类·视觉检测
巴里巴气1 天前
第73题 矩阵置零
线性代数·算法·矩阵
voice6701 天前
密码学实验二
算法·密码学·哈希算法
Blossom.1181 天前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物
寂静山林1 天前
UVa 10989 Bomb Divide and Conquer
算法