创世纪

这是我的第一道原创题

题解:

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

状态:\(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. 两个echarts地图联动高亮区域

    项目要求左右两张地图能够在鼠标悬浮的时候高亮部分联动,曾尝试了connect不好使,所以自己写了这段代码.代码思路为: 鼠标移入地图时,另一侧的地图根据鼠标悬浮获取到的区域name使该区域高亮: 鼠标 ...

  2. python-图的字典表示

    图的字典表示.输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度.比如上图0点表示:{'O':{'A':2,'B':5,'C':4}}.用eval函数处理输入,eva ...

  3. CCF201712-2游戏

    问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,--,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...

  4. webpack的安装 以及 问题 以及 作用

    参考链接: https://blog.csdn.net/Rnger/article/details/81086938     https://blog.csdn.net/qq_38111015/art ...

  5. Taro下拉刷新,上拉加载更多

    1.引入插件 import Taro, { Component } from '@tarojs/taro' import { View, Text, ScrollView } from '@taroj ...

  6. JavaScript 数组(Array)对象的方法

    JavaScript 数组(Array)对象的方法 concat() 描述:用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 原型:arrayObject.conc ...

  7. LC-977

    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,1 ...

  8. 虚拟机VMware的安装与Xshell的应用

    先安装VMware 1.安装就按照提示一点点安装就行了 配置网络 打开VMware 这里的IOS映像文件在https://developer.aliyun.com/mirror/里下载 这里用方向键往 ...

  9. Windows原理深入学习系列-强制完整性检查

    这是[信安成长计划]的第 24 篇文章 0x00 目录 0x01 介绍 0x02 逆向分析 Win10_x64_20H2 0x03 总结 0x04 参考文章 最近因为一些事情,拖更了三个周,大家见谅啊 ...

  10. Flex 的 多种对齐属性

    1. html 结构 <div id="container"> <div class="item item-1"> <h3> ...