文章

8

粉丝

71

获赞

0

访问

9.0k

头像
中南大学1673士兵排阵
我要提问
发布于2024年3月16日 12:50
阅读数 1.1k

这个答案里的对坐标x统一都-i是什么意思啊,为啥要对x这样处理排序之后就是最少步数啊,求大佬解答

	#include<bits/stdc++.h>
using namespace std;
//看完题我们会发现,其实y轴我们可以不考虑,而x轴是散乱的,如何将它们统一呢?
//其实很简单,我们只需要-i就可以统一
//最后我们求出它们的中位数(n+1)/2,并用曼哈顿距离求解
int n,a[100001],b[100001];
int main()
{
    while(cin>>n){
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
		sort(a+1,a+1+n);
		for(int i=1;i<=n;i++)a[i]-=i;
		sort(a+1,a+1+n);
		sort(b+1,b+1+n);
		int c=(n+1)/2;
		int ans=0;
		for(int i=1;i<=n;i++)ans+=abs(a[i]-a[c])+abs(b[i]-b[c]);
		cout<<ans<<endl;
	}
}

 

登录查看完整内容


登录后发布评论

3 条评论
快乐小土狗
2024年3月16日 13:09

这个题本质是一个贪心的问题,首先第一步,你要能看出来x坐标和y坐标是可以分开来处理的。单独针对x坐标其实就是给你一组数,你要把这些数全部变成同一个数,而且要改变的量最小,那么很明显就是中位数。y坐标同理,原理就是这样,你可以在纸上画一下理解这个思路。

赞(0)

哈哈宝宝游泳 : 回复 快乐小土狗: y变成同一个数我理解,但是那x减i的作用是啥呢,是让x变成从1到n连续的吗

2024年3月16日 14:14

快乐小土狗 : 回复 快乐小土狗: 是的,要求是连续嘛,是为了减去偏差转化成同样的问题,还是求中位数。

2024年3月16日 17:08