积水的城市 hiho[Offer收割]编程练习赛4

题目2 : 积水的城市

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

如下图所示,某市市区由M条南北向的大街和N条东西向的道路组成。其中由北向南第i条路和第i+1条路之间的距离是Bi (1 <= i < N),由西向东第i条街和第i+1条街之间的距离是Ai (1 <= i < M)。

小Ho现在位于第x条路和第y条街的交叉口,他的目的地是第p条路和第q条街的交叉口。由于连日降雨,城市中有K个交叉口积水太深不能通行。小Ho想知道到达目的地的最短路径的长度是多少。

输入

第一行包含两个整数N和M。(1 <= N, M <= 500)

第二行包含N-1个整数, B1, B2, B3, ... BN-1。(1 <= Bi <= 100)

第三行包含M-1个整数, A1, A2, A3, ... AM-1。(1 <= Ai <= 100)

第四行包含一个整数K,表示积水的交叉口的数目。 (0 <= K <= 30)

以下K行每行包含2个整数,X和Y,表示第X条路和第Y条街的交叉口积水。(1 <= X <= N, 1 <= Y <= M)

第K+5行包含一个整数Q,表示询问的数目。 (1 <= Q <= 10)

以下Q行每行包含4个整数x, y, p, q,表示小Ho的起止点。起止点保证不在积水的交叉口处。  (1 <= x, p <= N, 1 <= y, q <= M)

输出

对于每组询问,输出最短路的长度。如果小Ho不能到达目的地,输出-1。

样例输入
4 5
2 4 1
3 3 3 2
3
1 3
2 3
3 2
1
1 2 2 4  
样例输出
24

只能说刷题真好,之前模糊的知识,坐上几道题哦了。以后多刷题,专注点。少走神、、、
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
const int maxn = 200010;
typedef long long ll;
const int inf =0x3f3f3f3f;
int maze[505][505],d[505][505],nn[501],b[505],n,m;
struct node{
    int d,x,y;
    //node (int dd,int xx,int yy):x(xx), y(yy), d(dd) {}
    bool operator < (const node& a) const {
        return d>a.d;
    }
};
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int dis(int x,int y,int i){
    if(i==0)return b[y];
    if(i==1)return nn[x];
    if(i==2)return b[y-1];
    return nn[x-1];
}
void bfs(int s,int t){
    priority_queue<node> que;
    que.push(node{0,s,t});
    d[s][t]=0;
    while(!que.empty()){
        node q= que.top(); que.pop();
        int x=q.x,y=q.y,dd=q.d;
        //printf("%d %d %d \n",x,y,dd);
        if(d[x][y]!=dd)  continue;

        for(int i=0;i<4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            //printf("%d %d\n",nx,ny);
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!maze[nx][ny]&&(d[nx][ny]>d[x][y]+dis(x,y,i))){
                d[nx][ny]=d[x][y]+dis(x,y,i);
                que.push(node{d[nx][ny],nx,ny});
                //printf("%d %d %d \n",nx,ny,d[nx][ny]);
            }
        }
    }
}
int main()
{
    //freopen("data.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)   scanf("%d",nn+i);
    for(int i=1;i<m;i++)   scanf("%d",b+i);
    int q,k,x,y;

    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d%d",&x,&y);
        maze[x][y]=1;
    }
    scanf("%d",&q);
    while(q--){
        memset(d,0x3f,sizeof(d));
        int x,y,s,t;
        scanf("%d%d%d%d",&x,&y,&s,&t);
        bfs(x,y);
        if(d[s][t]==inf)   printf("-1\n");
        else  printf("%d\n",d[s][t]);
    }
}
时间: 2024-10-14 08:19:18

积水的城市 hiho[Offer收割]编程练习赛4的相关文章

hihocoder - [Offer收割]编程练习赛17

hihocoder - [Offer收割]编程练习赛17 题目1 : F1 Score 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和他的小伙伴们一起写了很多代码.时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了. 于是他实现了一个分类算法,希望用机器学习实现自动分类. 为了评价这个分类算法的优劣,他选出了N份有标记的代码作测试集,并决定用F1 Score作为评价标准. 给出N份代码的实际作者是不是小Hi以及分类算法预测的结果,请你计算F1 Sco

[Offer收割]编程练习赛11 题目1 : hiho字符串

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个字符串恰好包含2个'h'.1个'i'和1个'o',我们就称这个字符串是hiho字符串. 例如"oihateher"."hugeinputhugeoutput"都是hiho字符串. 现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个. 输入 字符串S 对于80%的数据,S的长度不超过1000 对于100%的数据,S的长度不超过100000 输

hihocoder offer收割编程练习赛11 A hiho字符串

思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int ch[100005], ci[100005], co[100005]; 10 1

[Offer收割]编程练习赛5-1 小Ho的防护盾

#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星舰会以T(T为大于0的整数)个单位时间的间隔向小Ho的城市轰击.歼星舰总共有N枚炮弹,其中第i枚会造成Ai点伤害值. 幸好小Ho的城市有K层护盾,每层护盾可以抵挡M点伤害.当某次轰击使得伤害值达或超过M时,该层护盾就会被击碎:该次轰击溢出的伤害不会作用于下一层护盾:下一次轰击将由下一层护盾承受. 同

HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如果A队1月1日参加了一场比赛,那么下一场比赛最早安排在1月3日. 给定M场比赛的时间和参赛的两支队伍,请你判断这个日程安排是否可行. 输入 第一行包含一个整数T,代表测试数据组数.(1 ≤ T ≤ 10) 对于每组数据,第一行包含两个整数N和M.(1 ≤ N ≤ 50, 1 ≤ M ≤ 1000)

[hihocoder] [Offer收割]编程练习赛43

版本号排序 不知道什么傻逼原因,就是过不了 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<algorithm> #include<iostream> #include<map> #

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

[Offer收割]编程练习赛15 A.偶像的条件[贪心]

#1514 : 偶像的条件 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校正面临着废校的大危机.面对学校的危机,小Hi同学们决定从ABC三个班中各挑出一名同学成为偶像. 成为偶像团体的条件之一,就是3名团员之间的身高差越小越好. 已知ABC三个班同学的身高分别是A1..AN, B1..BM 和 C1..CL.请你从中选出3名同学Ai, Bj, Ck使得D=|Ai-Bj|+|Bj-Ck|+|Ck-Ai|最小. 输入 第一行包含3个整数,N, M和L. 第

hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物

题目1 : 小Hi和小Ho的礼物 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 某人有N袋金币,其中第i袋内金币的数量是Ai.现在他决定选出2袋金币送给小Hi,再选2袋金币送给小Ho,同时使得小Hi和小Ho得到的金币总数相等.他想知道一共有多少种不同的选择方法. 具体来说,有多少种下标四元组(i, j, p, q)满足i, j, p, q两两不同,并且i < j, p < q, Ai + Aj = Ap + Aq. 例如对于数组A=[1, 1, 2, 2, 2]