牛客25461 雙噴泉澆花難題 如何用算法快速找到最優(yōu)解
关键思路
距离计算:对每朵花计算到两个喷泉的欧几里得距离平方
排序处理:按到第一个喷泉的距离排序
分割点搜索:从后往前寻找最优分割点,使得:
前i朵花由第一个喷泉覆盖
剩余花朵由第二个喷泉覆盖
特殊情况处理:考虑全部由一个喷泉覆盖的情况
算法步骤详解
输入处理:读取花朵和喷泉坐标
距离计算:预处理每朵花到两个喷泉的距离平方
排序优化:按到第一个喷泉的距离排序
逆向扫描:维护第二个喷泉需要的最大半径
结果计算:比较所有可能分割方案
完整代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Flower { long long d1, d2; // 到两个喷泉的距离平方 }; int main() { int n, x1, y1, x2, y2; cin >> n >> x1 >> y1 >> x2 >> y2; vector<Flower> flowers(n); for (int i = 0; i < n; ++i) { int x, y; cin >> x >> y; // 计算到两个喷泉的距离平方(避免浮点运算) long long dx1 = x - x1, dy1 = y - y1; long long dx2 = x - x2, dy2 = y - y2; flowers[i].d1 = dx1*dx1 + dy1*dy1; flowers[i].d2 = dx2*dx2 + dy2*dy2; } // 预处理:按d1升序排序 sort(flowers.begin(), flowers.end(), [](const Flower& a, const Flower& b) { return a.d1 < b.d1; }); // 预处理后缀最大值数组 vector<long long> suffix_max(n+1, 0); for (int i = n-1; i >= 0; --i) { suffix_max[i] = max(flowers[i].d2, suffix_max[i+1]); } long long min_sum = suffix_max[0]; // 初始化为全部由喷泉2覆盖的情况 // 遍历所有可能的分割点 for (int i = 0; i < n; ++i) { long long current_sum = flowers[i].d1 + suffix_max[i+1]; min_sum = min(min_sum, current_sum); } cout << min_sum << endl; return 0; }
原文:牛客25461 双喷泉浇花难题 如何用算法找到最优解 从几何到优化的完美解法
點擊查看更多內(nèi)容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦