创世纪

这是我的第一道原创题

题解:

这道题的核心算法是:加维度的最短路+贪心

状态:\(dis[i][j][t][a]\)表示在 \(t\) 时,到达 \((i,j)\) ,当前共造\(a\)只"rat"的最小代价(所以相比平常的状态会多出两维)

表面上看到达一个点造的"rat"数是不固定的,实际上(在 \((t>=cnt*W[i][j])\) 的情况下,cnt越多,代价就越少),所以\(cnt=t/W[i][j]\),然后相当于两个相邻位置的代价就出来了,接着跑最短路即可。

解决不可以回到上一步的问题,只需要在队列里面加上两个变量表示当前的坐标,因此更新下一次时就特判不走这两个位置。

还有,这道题跑最短路的复杂度跟n,m规模无关,只跟t有关,所以你爆搜也行。

代码:

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=105;
const int MaxT=17;
int n,m,L,T,A;
int W[N][N],f[N][N][MaxT][3*MaxT],dx[9]={0,0,1,-1,1,1,-1,-1},dy[9]={1,-1,0,0,1,-1,1,-1},inf=0x3f3f3f3f;
struct node {
int x,y,w,t,a,lx,ly;
bool operator<(const node &u) const{
return w>u.w;
}
};
bool mark[N][N][MaxT][3*MaxT];
priority_queue<node> Q;
void DJ(int sx,int sy) {
memset(f,0x3f,sizeof(f));
f[sx][sy][1][0]=0;
Q.push((node){sx,sy,W[sx][sy],1,0,0,0});
while(!Q.empty()) {
int ux=Q.top().x,uy=Q.top().y,t=Q.top().t,a=Q.top().a,lx=Q.top().lx,ly=Q.top().ly; Q.pop();
if(mark[ux][uy][t][a]||a>A) continue;
// printf("x=%d y=%d t=%d a=%d %d\n",ux,uy,t,a,f[ux][uy][t][a]);
mark[ux][uy][t][a]=true;
for(int d=0;d<4;d++) {
int vx=ux+dx[d],vy=uy+dy[d];
if(vx<1||vx>n||vy<1||vy>m||(vx==lx&&vy==ly)) continue;
t++;
int cnt=t/W[vx][vy]; //<=T最多是几倍 W[vx][vy]
if( t<=T && !mark[vx][vy][t][a+cnt] && f[vx][vy][t][a+cnt] >= f[ux][uy][t-1][a] + (t-cnt*W[vx][vy]) ) {
f[vx][vy][t][a+cnt] = f[ux][uy][t-1][a] + (t-cnt*W[vx][vy]);
Q.push((node){vx,vy,f[vx][vy][t][a+cnt],t,a+cnt,ux,uy});
}
t--;
}
}
}
int main() {
// freopen("1.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&L,&T,&A);
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
scanf("%d",&W[i][j]);
}
}
DJ(1,1);
int ans=inf;
for(int a=A;a<=A+T;a++)
for(int t=1;t<=T;t++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
ans=min(f[i][j][t][a],ans);
// printf("!x=%d y=%d t=%d a=%d: %d\n",i,j,t,a,f[i][j][t][a]);
} if(ans==inf||ans>L) printf("Death.");
else {
printf("Yes.\n%d",ans);
}
return 0;
}

T1创世纪(原创)的更多相关文章

  1. Poetize4 创世纪

    3037: 创世纪 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 123  Solved: 66[Submit][Status] Description ...

  2. 为创世纪图书馆(Library Genesis)作镜像

    简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...

  3. 编程哲学之C#篇:01——创世纪

    我们能否像神一样地创建一个世界? 对于创建世界而言,程序员的创作能力最接近于神--相对于导演,作家,漫画家而言,他们创建的世界(作品)一旦完成,就再也不会变化,创建的角色再也不会成长.而程序员创建的世 ...

  4. 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP

    [BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...

  5. [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树

    创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...

  6. CH6401 创世纪

    6401 创世纪 0x60「图论」例题 描述 上帝手中有 N(N≤10^6) 种世界元素,每种元素可以限制另外1种元素,把第 i 种世界元素能够限制的那种世界元素记为 A[i].现在,上帝要把它们中的 ...

  7. 图形学创世纪——写在SIGGRAPH 40年的边上

    40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...

  8. JZOJ 3929. 【NOIP2014模拟11.6】创世纪

    3929. [NOIP2014模拟11.6]创世纪 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 上帝手 ...

  9. bzoj3037 创世纪

    两种解法: 一.树状DP /*by SilverN*/ #include<iostream> #include<algorithm> #include<cstring&g ...

随机推荐

  1. 【uniapp 开发】校验工具类 CheckUtil

    校验手机号格式 /** * 验证是否为电话号码(座机) * * @param {} * source */ function isTelephone(source) { var regex = /^( ...

  2. Java 请求转发和重定向的区别以及JavaWeb三大作用域

    三大作用域以及转发和重定向 学习总结 1. 转发和重定向 转发 重定向 转发和重定向的区别: 什么时候用转发什么时候用重定向 三大作用域 作用域类型 作用域方法 如何选择作用域 总结 学习总结 1. ...

  3. 小程序获取自定义属性之e.target与e.currentTarget

    彻底弄懂小程序e.target与e.currentTarget 一.小程序中关于事件对象  e  的属性中有两个特别重要的属性:target与currentTarget属性:对于这两个属性,官方文档上 ...

  4. Vulnhub 之 Earth

    靶机地址:https://www.vulnhub.com/entry/the-planets-earth,755/ Kali IP:192.168.56.104 下载OVA文件后,直接通过Virtua ...

  5. ABP源码分析 - 约定注册(2)

    比较随意,记录下过程,以便忘了以后重拾. 所谓约定注册是指不需要明确写代码注入,只需要按约定规则写服务类,框架自动完成服务注册. 例如,只要这样写,框架就会自动注册. public class Tax ...

  6. linux(Ubuntu)安装python

    Linux下安装python 提前安装一个依赖环境 (1)ubuntu/Debian: sudo apt-get install -y gcc make cmake build-essential l ...

  7. Python程序的流程

    1 """ 2 python程序的流程 3 """ 4 # ------------- 分支结构---------------- 5 # i ...

  8. allure用法(一)-配置信息及基本用法

    allure是一个轻量级的,灵活的,支持多语言的测试报告工具 优点: 可以为dev/qa 提供 详尽的测试报告.测试步骤.日志 可以为管理层提供更好的统计报告 Java语言开发的 可以集成到jenki ...

  9. Solon 1.6.36 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  10. Python学习进度汇报

    学习进度还是比较慢的,上周五(18号晚上安装了Pycharm)就开始学,五天只到这个位置,当前一直是2倍速看黑马的Python视频,外加查看菜鸟的文档,需要加快一些进度了,后续还有后续的目标要实现,争 ...