排序算法 差分 1895 B. Points and Minimum Distance

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

void solve()
{
	int n;
	cin>>n;
	
	vector<int> a(2*n);
	for(int i=0;i<2*n;i++)	cin>>a[i];
	sort(a.begin(),a.end());
	
	vector<int> b(n);
	for(int i=0;i<n;i++)
		b[i]=a[i];
	int ans=0;
	for(int i=0;i<n-1;i++)
	{
		ans+=b[i+1]-b[i];
		ans+=a[i+1+n]-a[i+n];
	}
	cout<<ans<<endl;	
	for(int i=0;i<n;i++)
		cout<<b[i]<<" "<<a[i+n]<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

独立写出来一道B题,还是非常开心的,该题主要是排序算法

排序+差分

要求最短的距离,所以最好就是按照从小到大的顺序排好,题目中定义了一种比较新的距离,两个横坐标的差,两个纵坐标的差,两者求和,差越小和就越小,所以把排序好的前面n个元素作为横坐标,后面n个元素作为纵坐标,做一个差分,然后求和就是答案,把前面n个元素存在一个数组里面方便输出,事实上不存也可以直接输出,我这个操作应该是多余了

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

void solve()
{
	int n;
	cin>>n;
	
	vector<int> a(2*n);
	for(int i=0;i<2*n;i++)	cin>>a[i];
	sort(a.begin(),a.end());
	
	int ans=0;
	for(int i=0;i<n-1;i++)
	{
		ans+=a[i+1]-a[i];
		ans+=a[i+1+n]-a[i+n];
	}
	cout<<ans<<endl;	
	for(int i=0;i<n;i++)
		cout<<a[i]<<" "<<a[i+n]<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

这样就简洁了许多

相关推荐
朔北之忘 Clancy3 小时前
2025 CSP-J 第二轮真题解析
c++·青少年编程·题解·noip·csp·信奥赛·noi
longlongzihan3 小时前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
yolo_guo3 小时前
调试mysql延迟与libevent回调实际发送回复时机问题
c++·mysql·libevent
封印师请假去地球钓鱼3 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
今晚打老虎4 小时前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
不会就选b5 小时前
算法日常・每日刷题--<贪心>26
数据结构·算法
by209995 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
2601_962218616 小时前
C语言中三种库的编译和使用方法
开发语言·c++
jimy16 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
ebiobiz7 小时前
基于 GD32 Embedded Builder (GEB) 与 Nimmake 的 MCU 工程搭建指南
c++·python·单片机·嵌入式硬件·mcu