2022暑期牛客多校训练第5场 A.Don‘t Starve

本文探讨了一个二维平面上的食物收集问题,目标是在每次直线移动中收集食物并返回原点,同时确保每次移动距离递减。通过反向思考策略,文章介绍了如何按边长降序排序并计算最多可收集的食物数量。关键算法步骤包括边长计算、路径遍历和食物分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接

                https://ac.nowcoder.com/acm/contest/33190/A

题目大意

在二维平面上,有 n ( 1 ≤ n ≤ 2000 ) n(1 \leq n \leq 2000) n(1n2000) 个位置有食物。从原点出发,每次直线前往其他任意一个有食物的位置收集食物。收集完后再次前往下一个点。每当离开一个有食物的点后,该点的食物最后刷新。并且每次的移动距离必须严格下降。
求最多可以收集到多少食物。

题解

由题目得,所经过的路径需要递减,如果直接考虑状态的话本蒟蒻难以下手,
根据“正难则反”,我们考虑一下反着思考,只需要最后一个点是原点即可,思路就清晰多了。
我们只需要从大到小将边长进行排序,尽可能选择较大的边遍历即可。
如果有相同边长的边,我们需要将其共同进行储存结果计算即可,再进行新的计算。
代码的复杂度在 O ( n 2 l o g n 2 ) O(n^2logn^2) O(n2logn2) sort牛逼
边长的计算需要用欧拉公式记录。

参考代码

#include<bits/stdc++.h>
#define FOR(i,n,m) for(int i=n;i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值