当前位置: 首页 > news >正文

P2535 [AHOI2012] 收集资源 - Link

题意

\(n\times n\) 的平面上有很多点,有 \(m\) 个点有点权。从点 \(i\) 走到点 \(j\) 的时间为两点的曼哈顿距离,求从 \((0,0)\) 出发,花费至多 \(T\) 个单位时间,能获得的最大权值。
\(n,m,T\le200\)

思路

似乎是 \(NP-hard\),考虑使用搜索。
\((0,0)\) 和带权值的点当作关键点,在关键点之间两两连边,如果两个关键点围成的矩形中间有其祂点,那么不连边,因为这样走一定是不优的。然后跑 \(dfs\),计算当前剩余时间每次都走最短的那条边并且取权值最大的那个点所能取到的权值和,把祂设为估价函数,进行剪枝。

代码

拿下最优解。

// Problem: P2535 [AHOI2012] 收集资源
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2535
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>inline void read(T&x){x=0;char c=getchar();bool f=0;while(!isdigit(c)) c=='-'?f=1:0,c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar();f?x=-x:0;}template<typename T>inline void write(T x){if(x==0){putchar('0');return ;}x<0?x=-x,putchar('-'):0;short st[50],top=0;while(x) st[++top]=x%10,x/=10;while(top) putchar(st[top--]+'0');}inline void read(char&c){c=getchar();while(isspace(c)) c=getchar();}inline void write(char c){putchar(c);}inline void read(string&s){s.clear();char c;read(c);while(!isspace(c)&&~c) s+=c,c=getchar();}inline void write(string s){for(int i=0,len=s.size();i<len;i++) putchar(s[i]);}template<typename T>inline void write(T*x){while(*x) putchar(*(x++));}template<typename T,typename...T2> inline void read(T&x,T2&...y){read(x),read(y...);}template<typename T,typename...T2> inline void write(const T x,const T2...y){write(x),putchar(' '),write(y...),sizeof...(y)==1?putchar('\n'):0;}
}using namespace IO;
const int maxn=210;
int n,m,T,minn[maxn],ans,max_val,min_all=1000000000;
bool vis[maxn];
vector<pair<int,int>>e[maxn];
struct node{int x,y,val;}a[maxn];
bool check(int i,int j){int x=min(a[i].x,a[j].x),xx=max(a[i].x,a[j].x),y=min(a[i].y,a[j].y),yy=max(a[i].y,a[j].y);for(int k=0;k<=m;k++){if(k==i||k==j) continue;if(x<=a[k].x&&a[k].x<=xx&&y<=a[k].y&&a[k].y<=yy) return 1;}return 0;
}
void dfs(int u,int val,int ti){vis[u]=1;if(val+(T-ti)/min_all*max_val<ans){vis[u]=0;return ;}if(val>ans){ans=val;}if(ti+minn[u]>T){vis[u]=0;return ;}for(auto[v,cost]:e[u]){if(ti+cost>T) continue;if(vis[v]) continue;dfs(v,val+a[v].val,ti+cost);}vis[u]=0;
}
signed main(){read(n,m,T);for(int i=1;i<=m;i++) read(a[i].x,a[i].y,a[i].val),max_val=max(max_val,a[i].val);for(int i=0;i<=m;i++) for(int j=i+1;j<=m;j++){if(check(i,j)) continue;int ct=(int)(abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y));e[i].push_back({j,ct});e[j].push_back({i,ct});}for(int i=0;i<=m;i++){minn[i]=100000000;for(auto[j,cost]:e[i]){minn[i]=min(minn[i],cost);if(cost) min_all=min(min_all,cost);}}dfs(0,0,0);write(ans);return 0;
}
http://www.jsqmd.com/news/710435/

相关文章:

  • 单例模式终极指南:如何实现线程安全的C++单例模式
  • Tiktokenizer:AI开发者的终极令牌成本控制工具
  • 从零到一:手把手教你用YonBuilder for NCC搭建NC Cloud 2021.11开发环境(含避坑指南)
  • RV1126开发板AP6256 WiFi驱动移植实战:从硬件查看到固件编译的完整避坑指南
  • 从ListBox到DataGridView:C#桌面应用数据展示控件该怎么选?一个例子讲清楚
  • YOLOv5-Face人脸检测终极指南:从零开始的高精度实时检测
  • 高坪效易落地,无限方舟破解文旅沉浸式项目落地难题
  • 20252321 实验三《Python程序设计》实验报告
  • Bodymovin 插件终极指南:3步将After Effects动画变成网页魔法
  • JTS 核心几何类型详解:从点到多边形的完整解析
  • 抖音批量下载工具:自动化内容获取与高效文件管理方案
  • GitHub记忆增强工具:基于向量搜索与知识图谱的开发者效率解决方案
  • 如何利用Hono框架的ETag与Cache API实现毫秒级缓存优化
  • 终极Material Design Lite引导提示:Tooltip组件完全指南
  • Clinstagram:为AI智能体设计的Instagram双后端自动化工具
  • LibreCAD终极指南:为什么这款免费开源2D CAD软件是AutoCAD的最佳替代品
  • JTS Topology Suite 入门指南:Java 向量几何库的快速上手教程
  • 比亚迪DiLink 4.0车机Root保姆级教程:从固件提取到Magisk修补,手把手带你解锁ADB调试
  • 游戏开发进入AI时代:你准备好了吗?从工具到生产力:AI如何重塑Unity开发体系
  • 大湾区与狮城:亚洲 Web3、Fintech 与家族办公室 IT 架构师的双城记
  • 思源宋体深度解析:从技术原理到实战应用的全面掌握
  • 20252426汪裕植 2025-2026-5《Python程序设计》实验3报告
  • 别再死磕公式了!用PyTorch实战MINE(Mutual Information Neural Estimation),5步搞定神经网络互信息估计
  • OmenSuperHub终极指南:免费解锁惠普游戏本性能的完整教程
  • AWS RDS监控终极指南:10个关键指标深度解析与性能优化
  • 本地优先AI工作空间AzulClaw:安全架构与混合部署实践
  • PvZ Toolkit:开源植物大战僵尸修改器的终极完整指南
  • Cadence IC617新手避坑指南:从零搭建MOS仿真环境(附TSMC18rf库配置)
  • 用户Git提交里带个文件名,Claude竟偷偷扣光200美元?Anthropic这波操作真离谱!
  • 如何实现Docsify文档站点的可持续发展:环保与资源优化终极指南