"蔚来杯"2022牛客暑期多校训练营5 A:Don’t Starve

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

题面

NIO purchased a new game, Don’t Starve, a sandbox game published by Klei Entertainment Inc. This game revolves around a scientist named Wilson who finds himself in a dark and gloomy world and must survive for as long as possible.

In the very beginning, NIO should help Wilson to gather some food for survival. Assume that when controlling Wilson to walk towards a location on the map, NIO should keep pressing the left button on the mouse, and when Wilson comes to the place where there is food, NIO should stop pressing the mouse, but press the space key on the keyboard to collect the food at this location. As NIO will feel tired of pressing the mouse for a long time and his finger will become very uncomfortable after a long time of pressing, the time he is willing to press the mouse after each collection is strictly decreased. Suppose there are NN locations on the 2-D plane, and at each point, there is only one unit of food. And NIO will start at the original point on the plane. You can assume that each point has an infinite number of food items, but only one can be taken at a time.

What is the maximum amount of food can NIO get for Wilson? Note that the food will be refreshed after Wilson left.

大意

给定平面上 nnn 个点,从原点出发直线前往这些点收集食物,收集完再前往下一个点。每当离开一个有食物的点后该点食物刷新,每次移动距离严格下降。问最多收集到多少食物。n≤2×103n≤2×10^3n≤2×103

题解

可以看出选择dp,但如果是普通dp则会超时和超内存(时间为 O(n4)\Omicron(n^4)O(n4),空间为O(n3)\Omicron(n^3)O(n3)),因此需要优化处理。注意如果每次都选符合条件的最长边,可能不是最优解,存在反例。

  • 设 f[i][j]f[i][j]f[i][j] 表示从i走到j后还能走拿多少食物,因为这个状态与之前的状态无关,得到转移方程 f[i][j]=max(f[j][k])f[i][j]=max(f[j][k])f[i][j]=max(f[j][k]) 其中,j−>kj−>kj−>k 这条路的长度小于 i−>ji−>ji−>j 的长度,因此可以先将所有边按长度从小到大排序,这样在考虑当前的路时,之前的路都是可以走的。可以用 s[i]s[i]s[i] 表示目前从 iii 出发最远可以走多远,注意如果有长度相同通往同一个点的路,应该同时被考虑到。
  • 当然也可以用反向 dpdpdp,设 dpidp_idpi​ 是从点 iii 出发所能得到的最大食品数,从小到大转移,如上,这样操作使得在考虑当前的路时,之前的路都是可以走的
    转移方程:
    dpi=max(1+dpj)dp_i=max(1+dp_j) dpi​=max(1+dpj​)

参考代码

是第一种做法

#include <bits/stdc++.h>
using namespace std;
const int maxn=5000006;
const int maxm=2003;
struct edge{int u,v,w;
}ed[maxn];
int n,cnt;
int x[maxn],y[maxn],s[maxm];
int f[maxm][maxm];
bool cmp(edge x,edge y)
{return x.w<y.w;
}
int main()
{bool flag=false;cin>>n;for(int i=1;i<=n;++i){cin>>x[i]>>y[i];if(!x[i]&&!y[i]) flag=true;for(int j=0;j<i;++j) ed[++cnt]=edge{i,j,(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])};}sort(ed+1,ed+cnt+1,cmp);for(int i=1;i<=cnt;++i) {int j=i;while(ed[i].w==ed[j+1].w&&j<cnt) ++j;for(int k=i;k<=j;++k) {int u=ed[k].u,v=ed[k].v;if(v) f[u][v]+=s[v]+1;if(u) f[v][u]+=s[u]+1;}for(int k=i;k<=j;++k) {int u=ed[k].u,v=ed[k].v;if(u) s[u]=max(s[u],f[u][v]);if(v) s[v]=max(s[v],f[v][u]);}i=j;}int ans=0;for(int i=1;i<=n;++i) ans=max(ans,f[0][i]);cout<<ans+flag<<endl;return 0;
}

“蔚来杯“2022牛客暑期多校训练营5 A:Don‘t Starve相关推荐

  1. “蔚来杯“2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案)

    "蔚来杯"2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案) 题意 找一个环 上面的边权 极差最大 并输出 点 思路 我们先强联通缩点 统计 ...

  2. “蔚来杯“2022牛客暑期多校训练营1

    "蔚来杯"2022牛客暑期多校训练营1 C Grab the Seat! D Mocha and Railgun 题意: 给定一个圆环,中心为(0, 0).给定T个查询,每次给定环 ...

  3. “蔚来杯“2022牛客暑期多校训练营9 补题题解(A、B、G、E)

    "蔚来杯"2022牛客暑期多校训练营9 A Car Show B Two Frogs G Magic Spells E Longest Increasing Subsequence ...

  4. “蔚来杯“2022牛客暑期多校训练营6

    "蔚来杯"2022牛客暑期多校训练营6 [题目链接]("蔚来杯"2022牛客暑期多校训练营6_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛 ...

  5. “蔚来杯“2022牛客暑期多校训练营10,签到题HFIE

    题号 标题 已通过代码 通过率 团队的状态 A Everlasting Transeunt 点击查看 6/42 B Fall Guys-Perfect Match 点击查看 6/115 C Magic ...

  6. “蔚来杯“2022牛客暑期多校训练营8

    Equivalence in Connectivity 前置知识点如下: 1. 并查集哈希 2. 可撤销并查集 3. 线段树分治 #include<bits/stdc++.h> using ...

  7. “蔚来杯“2022牛客暑期多校训练营10补题

    H  Wheel of Fortune 题意 有两个人在打炉石,一方转动了尤格萨隆的命运之轮触发了炎爆选项.双方英雄的血量分别为A和B,双方场面的血量分别为ai和bi,问A获胜的概率. 思路 将代码分 ...

  8. “蔚来杯“2022牛客暑期多校训练营8 D题: Poker Game: Decision

    D题: Poker Game: Decision 原题链接:https://ac.nowcoder.com/acm/contest/33193/D 题目大意 在德州扑克的大小比较规则情况下,发牌顺序与 ...

  9. “蔚来杯“2022牛客暑期多校训练营2 G.[Link with Monotonic Subsequence] 分块构造

    G. Link with Monotonic Subsequence 构造 题目分析 要求构造一个长度为 n n n的序列,使得序列的 max ⁡ ( lis ( p ) , lds ( p ) ) ...

  10. “蔚来杯“2022牛客暑期多校训练营2 个人题解集合

    文章目录 D.[Link with Game Glitch](https://ac.nowcoder.com/acm/contest/33187/D) 题目分析 Code G.[ Link with ...

最新文章

  1. 【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等
  2. Ubuntu软件仓库-转载
  3. 云炬VB开发笔记 5循环结构
  4. 蒙特利尔大学发布2021年最新自监督小样本检测综述
  5. Java命令学习系列(四)——jstat
  6. nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性
  7. 错误:document.getElementById(userForm).submit();Object is not a function
  8. python与机器学习(七)下——torchvision预训练模型测试真实图像分类
  9. 中国女性灭菌装置行业市场供需与战略研究报告
  10. Java 定时器 Timer 与 定时任务 TimeTask
  11. 小程序直播 OBS 画质_教你玩转微信小程序直播
  12. pdf编辑工具linux,7个Ubuntu下的PDF编辑工具
  13. mysql 数据库建模工具 mysqlworkbench
  14. 软路由cpu性能跑分
  15. 经典再现,看到就是赚到。尚硅谷雷神 - SpringBoot 2.x 学习笔记 - 核心功能篇
  16. Ubuntu18中调用cv2.imshow及PIL库遇到的bug “: cannot connect to X server”及display-im6.q16: unable to open X。。。
  17. 关于ArcGIS新建Person Geodatabase(.mdb)报错的问题
  18. 时间轮算法HashedWheelTimer
  19. Java中关于子类重写父类方法的坑
  20. matlab 提取谐波,用MATLAB采用MUSIC法进行谐波提取出现问题

热门文章

  1. 英语语法(简单句型篇)
  2. 在Unity中使用Photon(网络多人联机)
  3. win10系统如何玩各个版本的红色警戒
  4. ios系统铃声调用方法
  5. hashcat跑包小秘诀
  6. C语言日期计算器vs2022
  7. c语言天数倒计时软件,c语言 日期倒计时 日期计算器
  8. css鼠标经过改变盒子,鼠标经过盒子出现边框(伪元素,定位,css3盒子模型)...
  9. DPDK应用示例指南简介(汇总)
  10. Rainmeter音频频谱插件分享