创世纪

这是我的第一道原创题

题解:

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

状态:\(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. 前端每日实战:89# 视频演示如何用 CSS 和 D3 创作旋臂粒子动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 此视频是可 ...

  2. Android的Activity屏幕切换动画左右滑动切换

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  3. java反射相关

    反射的机制:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...

  4. 微信小程序页面跳转参数传递

    可以使用标签直接传递 <navigator class="gotoDetail" target="self" url="../detail/de ...

  5. 6.Jenkins进阶之流水线pipeline语法入门学习(1)

    目录一览: 0x00 前言简述 Pipeline 介绍 Pipeline 基础知识 Pipeline 扩展共享库 BlueOcean 介绍 0x01 Pipeline Syntax (0) Groov ...

  6. SSL及GMVPN握手协议详解

    之前写过一篇文章搞懂密码学基础及SSL/TLS协议,主要介绍了加密学的基础,并从整体上对SSL协议做了介绍.由于篇幅原因,SSL握手的详细流程没有深入介绍.本文将拆解握手流程,在消息级别对握手进行详细 ...

  7. who 的页面制作

    1. html 结构 <!-- section: Who we are --> <section id="who"> <div class=" ...

  8. python基础练习题(题目 统计 1 到 100 之和)

    day31 --------------------------------------------------------------- 实例045:求和 题目 统计 1 到 100 之和. 分析: ...

  9. python基础练习题(题目 递归求阶乘)

    day18 --------------------------------------------------------------- 实例026:利用递归方法求5! 分析:递归包括递归体和递归条 ...

  10. 利用java反射机制实现List>转化为List

    BEGIN; 最近在用hibernate做项目,由于后续的业务功能比较多,然后框架原设计没有使用到一对多.一对一等特性,(艹TA妹)没办法,只能用原生sql语句获得需要的结果集.但是返回过来的是一个L ...