2023百度之星初赛第二场
1. BD202309 星际航行(贪心)
题目描述:
在深邃的宇宙中,星际舰队从地球出发,向未知的星际深渊进发。这支舰队是由最新科技的结晶,由 n 艘星际飞船组成,每一艘飞船都像一颗璀璨的星辰,静静地驶过宇宙的深渊。
飞船的航行是静谧而神秘的,仿佛在宇宙中航行的幽灵,无声无息地穿行在星辰之间。然而,这静谧的星空并不安全,未知的危险随时可能来临。这就需要舰队成员们时刻保持警惕,如临大敌。
然而,这次航行并没有像预期的那样顺利。在舰队深入星空的某个地方,收到来自地球检测装置的警报,舰队已经进入外星文明的探测区域,舰队希望排布成一条连续的直线以减少舰队被外星文明探测到的可能。
每一艘飞船可以看做三维空间上的一个点,第i艘飞船可以用三维坐标
由于飞船在宇宙中航行受到此地星空的约束,任何时刻飞船只能沿着三个维度中的一个维度飞行,每移动一个单位,会消耗一个单位的能源。
尽管情况紧急,舰队仍然需要为后续的航行做准备。作为舰队成员之一的你,需要给出舰队排成一条连续的直线最少消耗多少能源。
格式
输入:第 1 行,输入的是整n
;接下来的 n 行分别包含三个数字,表示每艘飞船的坐标,x,y,z 。
输出:一行一个数字,表示最少消耗多少能源。
样例
输入:3
2 0 2
6 35 -87
0 184 -126
输出:316
说明
样例解释:
可行的一组方案为:
把所有点的x移动到2,代价为|2-2|+|6-2|+|0-2|=6;
把所有点的y移动到区间[34,36],代价为|0-34|+|35-35|+|184-36|=182;
把所有点的z移动到区间-87,代价为|-87-2|+|-87-(-87)|+|-87-(-126)|=128;
总代价为:6+182+128=316。
点击查看代码
#include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr) #define fi first #define se second #define int long long #define YES "YES\n" #define NO "NO\n" #define Yes "Yes\n" #define No "No\n" #define yes "yes\n" #define no "no\n" #define Mod 998244353 #define mod 1000000007 #define pi 3.14159 using namespace std; const int N = 1e5 + 10; int x[N], y[N], z[N]; int n,ans; int cal(int a[])//计算单点代价 { int ans = 0; int l = 1, h = n; while(l <h) ans = ans + abs(a[l ++] - a[h --]); return ans; } void solve() { cin >> n; for(int i = 1; i <= n; i ++) cin >> x[i] >> y[i] >> z[i]; auto f = [](int a, int b){return a < b;}; sort(x + 1, x + n + 1, f); sort(y + 1, y + n + 1, f); sort(z + 1, z + n + 1, f); ans = cal(x) + cal(y) + cal(z); int l = 1, h = n; while(l < h) ans -= h-- - l ++; //扣除直线代价空缺,0->35=0->34+34->35,184->35=184->36+36->35 //前面ans是直线到中心,可以看成ans->边界+边界->中心 //现在扣除的是边界->中心 cout << ans << '\n'; } signed main() { IOS; int _ = 1; // cin >> _; while(_ --) solve(); return _ ^ _; }
本文作者:chfychin
本文链接:https://www.cnblogs.com/chfychin/p/17729850.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步