惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Last Week in AI
Last Week in AI
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
The Cloudflare Blog
罗磊的独立博客
月光博客
月光博客
N
Netflix TechBlog - Medium
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
Jina AI
Jina AI
J
Java Code Geeks

博客园 - 糖豆爸爸

【树上DP前导知识汇总】 快速幂、龟速乘总结 反向建图+拓扑排序 卡特兰数专题(Catalan) AcWing 126. 最大的和 AcWing 431. 守望者的逃离 AcWing 414. 数字游戏 AcWing 468. 魔法阵 AcWing 463. 求和 P1056 NOIP2008 普及组 排座椅 洛谷 P1889 士兵站队 洛谷 P1862 输油管道问题 CF444C DZY Loves Colors P2253 好一个一中腰鼓! SCOI2010 P2572 序列操作 P4344 SHOI2015 脑洞治疗仪 T125847 【模板】动态开点线段树 P3373 【模板】线段树 2 Physical Education Lessons
洛谷 P1632 点的移动
糖豆爸爸 · 2023-09-19 · via 博客园 - 糖豆爸爸

洛谷 \(P1632\) 点的移动

一、题目大意

求平面上 \(1、2⋯n\) 个点的曼哈顿距离的最小值。

二、解题思路

枚举,我们假设 \(m\) 个点的最小曼哈顿距离,我们假设汇集的点是 \((x,y)\) ,则
\(x\) 必然可以选择 \(n\) 个点的横坐标中的一个, \(y\) 也可以选 \(n\) 个点的纵坐标中的一个。
所以我们枚举 \(x\)\(y\) 然后求距离即可。

三、\(Code\)

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, x[N], y[N], dist[N], ans[N];

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> x[i] >> y[i];
    memset(ans, 0x3f, sizeof ans);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) { // 双重循环枚举每个已知的点
            int X = x[i];             // 假设最终的结果是这个X
            int Y = y[j];             // 假设最终的结果是这个Y

            // 计算每个点到(X,Y)的汉密尔顿距离
            for (int k = 0; k < n; k++)
                dist[k] = abs(x[k] - X) + abs(y[k] - Y);

            // 由小到大排序
            sort(dist, dist + n);

            int cnt = 0;
            for (int k = 0; k < n; k++) {
                cnt += dist[k]; // 累加每一个限定范围的最小距离和
                ans[k] = min(ans[k], cnt);
            }
        }
    }
    // 输出答案
    for (int i = 0; i < n; i++) printf("%d\n", ans[i]);
    return 0;
}