UVa1321/LA2925 Dice contest

news2024/11/18 22:24:38

UVa1321/LA2925 Dice contest

  • 题目链接
  • 题意
  • 分析
  • 测试数据
  • AC 代码

题目链接

   本题是2003年icpc欧洲区域赛中欧赛区的D题

题意

   骰子的六面展开图如下,现在把骰子的六个面赋予一套权重 w i ( 1 ≤ w i ≤ 50 , 1 ≤ i ≤ 6 ) w_i(1\le w_i \le 50,1\le i\le 6) wi(1wi50,1i6),每翻转一次骰子的代价是翻转转后顶面的权重。
dice
   有一个4行无数列的网格桌子,初始时骰子顶面是1点,正面是2点(面向玩家),放置在 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)格子处,每次可以将骰子翻转到上下左右之一的相邻格子,翻转的代价是反转后顶面的权重,求将骰子翻转到 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)格子处的最小代价 ( − 1000000000 ≤ x 1 , x 2 ≤ 1000000000 , 1 ≤ y 1 , y 2 ≤ 4 ) (-1000000000\le x_1,x_2\le 1000000000,1\le y_1,y_2\le 4) (1000000000x1,x21000000000,1y1,y24)

分析

   题意倒是好理解,但是题目的sample数据和uDebug上标程的输出不一致,巨坑。

1 2 3 8 1 4
-1 1 0 2

   题目说sample输出是7,然而标程输出是5,反而下面这个数据标程才是输出7。

1 2 8 3 1 4
-1 1 0 2

   这其实就是行从上到下还是从下到上编号的区别,如下图所示。
dice1
   可见行从下往上是sample的输出是7,行从上往下输出是5(和标程相同),因此采用行从上往下处理。

   骰子不管在哪个网格,有24种状态,乘上行数4,总共96,起点到终点的横坐标跨度 d x dx dx可能很大,考虑稀疏表/倍增法可将复杂度优化到 O ( 9 6 3 log ⁡ d x ) O(96^3\log dx) O(963logdx)(不超过 3 × 1 0 7 ) 3\times 10^7) 3×107):记 a [ y 1 ] [ s 1 ] [ y 2 ] [ s 2 ] [ i ] a[y_1][s_1][y_2][s_2][i] a[y1][s1][y2][s2][i]表示骰子在第 y 1 y_1 y1行状态为 s 1 s_1 s1,翻转到第 y 2 y_2 y2行状态为 s 2 s_2 s2且横向移动量为 2 i 2^i 2i 1 ≤ y 1 , y 2 ≤ 4 , 0 ≤ s 1 , s 2 < 24 , 0 ≤ i < 31 1\le y_1,y_2\le 4,0\le s_1,s_2<24,0\le i<31 1y1,y24,0s1,s2<24,0i<31)的最小代价。

   这就需要求出初始横向移动量为1的最小代价 a [ y 1 ] [ s 1 ] [ y 2 ] [ s 2 ] [ 0 ] a[y_1][s_1][y_2][s_2][0] a[y1][s1][y2][s2][0],考虑到向右(或者向左)移动量为1的最小代价可能通过反方向移动更大的量再翻转回来(或者从其它行移动更大的量再翻转回来)而取得,如果横向移动动范围的极限能分析出来,并且极限比较小,则可以利用Dijkstra求得。

   一个感性的结论是:横向移动范围的极限是19(向左/向右9,加上0),因为绕骰子三条轴任意一条翻转的不同权重最多也就4种并且顺/逆时针连续翻转以4为周期,如果绕某轴顺/逆时针净翻转(有可能顺时针翻转了2次逆时针翻又转回来一次,最终顺时针净翻转了一次)了4次以上最终横向移动量达到1,完全可以净翻转少于4次达到同样的结果并且代价更小,三条不同轴总共最多净翻转9次,即便全部贡献给横向移动(纵向移动也可能占用净翻转),向左/向右的最大移动量也才9。

   因此确实可以用Dijkstra求出初始横向移动量为1的最小代价:记 d [ y 1 ] [ s 1 ] [ y 2 ] [ s 2 ] [ l ] d[y_1][s_1][y_2][s_2][l] d[y1][s1][y2][s2][l]表示骰子在第 y 1 y_1 y1行状态为 s 1 s_1 s1,翻转到第 y 2 y_2 y2行状态为 s 2 s_2 s2且横向移动量为 l l l的当前最小代价( 1 ≤ y 1 , y 2 ≤ 4 , 0 ≤ s 1 , s 2 < 24 , 0 ≤ l < 19 1\le y_1,y_2\le 4,0\le s_1,s_2< 24,0\le l< 19 1y1,y24,0s1,s2<24,0l<19,如果横向移动量是负数 x x x,则用 19 + x 19+x 19+x来替代),对每个出发结点 ( y 1 , s 1 ) (y_1,s_1) (y1,s1),将其和初始值 d [ y 1 ] [ s 1 ] [ y 1 ] [ s 1 ] [ 0 ] = 0 d[y_1][s_1][y_1][s_1][0]=0 d[y1][s1][y1][s1][0]=0入优先级队列跑一遍Dijkstra,最终 d [ y 1 ] [ s 1 ] [ y 2 ] [ s 2 ] [ 1 ] d[y_1][s_1][y_2][s_2][1] d[y1][s1][y2][s2][1]就是所求。

测试数据

   给一份CERC 2003官方的整套题解和测试数据。

AC 代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

#define L 19
long long d[4][24][4][24][L], a[4][24][4][24][31], e[2][4][24]; bool f[4][24][L];
int c[][2] = {{2, 3}, {6, 3}, {6, 5}, {6, 2}, {6, 4}, {2, 4}}, w[7], x1, y1, x2, y2;

struct node {
    int y, s, x; long long d;
    bool operator< (const node &rhs) const {
        return d > rhs.d;
    }
} t;

int encode(int t, int f) {
    --t;
    return (t<<2) + (f == c[t][0] ? 0 : (f == c[t][1] ? 1 : (f == 7-c[t][0] ? 2 : 3)));
}

void decode(int s, int &t, int &f) {
    t = s>>2; f = s&3; f = f < 2 ? c[t++][f] : 7-c[t++][f-2];
}

void roll(int s, int d, int &t, int &f) {
    int t0, f0; decode(s, t0, f0); int (&e)[2] = c[t0-1];
    if (d == 0) t = f0, f = 7-t0;
    else if (d == 1) t = 7-f0, f = t0;
    else if (d == 2) t = f0 == e[0] ? 7-e[1] : (f0 == e[1] ? e[0] : (f0 == 7-e[0] ? e[1] : 7-e[0])), f = f0;
    else t = f0 == e[0] ? e[1] : (f0 == e[1] ? 7-e[0] : (f0 == 7-e[0] ? 7-e[1] : e[0])), f = f0;
}

long long solve() {
    for (int i=1; i<7; ++i) cin >> w[i];
    cin >> x1 >> y1 >> x2 >> y2; x2 -= x1; --y1; --y2;
    priority_queue<node> q; memset(d, 1, sizeof(d));
    for (int i=0; i<4; ++i) for (int j=0; j<24; ++j) {
        long long (&r)[4][24][L] = d[i][j]; q.push({i, j, 0, r[i][j][0] = 0}); memset(f, 0, sizeof(f));
        while (!q.empty()) {
            t = q.top(); q.pop(); int y = t.y, s = t.s, x = t.x > (L>>1) ? t.x-L : t.x; long long d = t.d;
            if (f[y][t.x][s]) continue;
            f[y][t.x][s] = true;
            for (int k=0; k<4; ++k) {
                int u = k<2 ? (k ? y-1 : y+1) : y, v = k<2 ? x : (k>2 ? x+1 : x-1), t, f, g; roll(s, k, t, f);
                if (u<0 || u>3 || abs(v) > (L>>1)) continue;
                if (v < 0) v += L;
                if (d + w[t] < r[u][g = encode(t, f)][v]) q.push({u, g, v, r[u][g][v] = d + w[t]});
            }
        }
    }
    for (int y=0; y<4; ++y) for (int s=0; s<24; ++s) e[0][y][s] = d[y1][0][y][s][0];
    int b = x2<0 ? L-1 : 1, k = 0, c = 0; x2 = abs(x2); memset(a, 1, sizeof(a));
    for (unsigned int i=x2; (1<<k) <= i; ++k);
    for (int y=0; y<4; ++y) for (int s=0; s<24; ++s) for (int u=0; u<4; ++u) for (int v=0; v<24; ++v)
        a[y][s][u][v][0] = d[y][s][u][v][b];
    for (int w=1; w<k; ++w) for (int y=0; y<4; ++y) for (int s=0; s<24; ++s)
    for (int u=0; u<4; ++u) for (int v=0; v<24; ++v) for (int i=0; i<4; ++i) for (int j=0; j<24; ++j)
        a[y][s][u][v][w] = min(a[y][s][u][v][w], a[y][s][i][j][w-1] + a[i][j][u][v][w-1]);
    if (k--) {
        for (; x2 && k>=0; --k) if ((1<<k) <= x2) {
            for (int y=0; y<4; ++y) for (int s=0; s<24; ++s) {
                long long &r = e[c^1][y][s] = 200000000000;
                for (int u=0; u<4; ++u) for (int v=0; v<24; ++v) r = min(r, e[c][u][v] + a[u][v][y][s][k]);
            }
            c ^= 1; x2 -= 1<<k;
        }
    }
    long long ans = e[c][y2][0];
    for (int i=1; i<24; ++i) ans = min(ans, e[c][y2][i]);
    return ans;
}

int main() {
    int t; cin >> t;
    for (int k=0; k<t; ++k) {
        if (k) cout << endl;
        cout << solve() << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择适合您业务需求的多语言跨境电商系统源码

随着互联网技术的飞速发展和全球市场的日益融合&#xff0c;多语言跨境电商已经成为许多企业进军国际市场的重要战略。在这个竞争激烈的时代&#xff0c;拥有一个适合自己业务需求的多语言跨境电商系统源码至关重要。本篇文章将为您揭秘如何选择适合您业务需求的多语言跨境电商…

奥威BI零售数据分析的小心机:多维动态分析

多维动态分析&#xff0c;顾名思义&#xff0c;就是在多个维度上对数据进行灵活的、动态的分析。在零售业务中&#xff0c;这些维度可能包括商品、时间、地区、顾客群体等。奥威BI数据可视化工具凭借强大的数据处理和数据可视化能力&#xff0c;将这些维度巧妙地融合在一起&…

【Python画图-驯化01】一文叫你搭建python画图最优环境配置

【Python画图-循环01】一文叫你搭建python画图最优环境配置 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#…

一文get懂kwai短视频助力巴西博弈slots游戏广告优势

一文get懂kwai短视频助力巴西博弈slots游戏广告优势 在数字化时代&#xff0c;短视频广告凭借其独特的魅力和高效的传播方式&#xff0c;成为了各大品牌进行营销推广的重要手段。特别是在巴西这个充满活力的国家&#xff0c;kwai短视频广告以其独特的方式&#xff0c;为博弈游…

交友系统定制版源码| 相亲交友小程序源码全开源可二开_打造独特的社交交友系统

交友系统源码的实现涉及到多个方面&#xff0c;包括前端页面设计、后端逻辑处理、数据库设计以及用户交互等。以下是一个简单的交友系统源码实现的基本框架和关键步骤: 1.数据库设计:用户表:存储用户基本信息&#xff0c;如用户ID、用户名、密码、头像、性别、年龄、地理位置等…

探索NVIDIA A100 显卡 如何手搓A100显卡

NVIDIA A100 显卡&#xff08;GPU&#xff09;是基于NVIDIA的Ampere架构设计的高性能计算和人工智能任务的处理器。 A100显卡主要由以下几种关键芯片和组件组成&#xff1a; 1. GPU芯片 NVIDIA GA100 GPU&#xff1a; 核心组件&#xff0c;是整个显卡的核心处理单元。GA100芯…

数字IC设计-VCS和Verdi的使用

#学习记录# 前言&#xff1a;本文以一个简单的计数器来说明vcs和verdi的使用 1 代码文件 1.1 计数器代码 //Engineer&#xff1a;Mr-pn-junction module counter(input clk,input rst,output reg [5:0] count); always(posedge clk or negedge rst)beginif(!rst)coun…

【鸿蒙学习笔记】Image迭代完备

Image Image($r(app.media.zhibo)).width(96) // 图片宽度.height(96) // 图片高度.borderRadius(12) // 图片圆曲度.objectFit(ImageFit.Fill) // 不明objectFit Column({ space: 20 }) {Row() {Image($r(app.media.startIcon)).width(66).height(66).borderRadius(12)}.bac…

Qt入门小项目 | WPS tab页面(无边框窗口综合应用)

文章目录 一、手写代码实现WPS tab页面 一、手写代码实现WPS tab页面 实现类似WPS tab效果&#xff0c;具体包含&#xff1a; 自定义标题栏&#xff1a;最大、最小、关闭在QTabWidget的tab上增加控件在QTabWidget的tab上右键菜单可拖拽移动可拉伸窗口双击标题栏在最大与正常间…

14-10 AIGC 项目生命周期——第一阶段

生成式 AI 项目生命周期的整个过程类似于从范围、选择、调整和对齐/协调模型以及应用程序集成开始的顺序依赖过程。流程表明每个步骤都建立在前一步的基础上。有必要了解每个阶段对于项目的成功都至关重要。 下面的流程图重点介绍了生成式 AI 项目生命周期的第一阶段 1 — “范…

vue项目创建+eslint+Prettier+git提交规范(commitizen+hooks+husk)

# 步骤 1、使用 vue-cli 创建项目 这一小节我们需要创建一个 vue3 的项目&#xff0c;而创建项目的方式依然是通过 vue-cli 进行创建。 不过这里有一点大家需要注意&#xff0c;因为我们需要使用最新的模板&#xff0c;所以请保证你的 vue-cli 的版本在 4.5.13 以上&#xff…

Android 添加LBS辅助定位

1.软件需求&#xff1a; 某Android设备没有sim卡但其支持定位&#xff0c;客户需求为在已有的Android中添加LBS网络定位&#xff0c;用以辅助gps定位。 2.思路分析 首先看到这个需求笔者是比较懵逼的&#xff0c;秉持着客户是上帝的原则&#xff0c;笔者首先先了解了一下什么…

双向广搜——AcWing 190. 字串变换

双向广搜 定义 双向广搜是图搜索算法的一种变体&#xff0c;与传统的单向广搜不同&#xff0c;它同时从起点和终点&#xff08;或目标状态&#xff09;开始进行搜索&#xff0c;直到两个搜索的前沿相遇为止。这种方法可以在某些情况下显著减少搜索空间&#xff0c;尤其是在寻…

安装PyTorch详细过程(个人过程仅供参考)

1.安装anaconda 2.创建一个虚拟环境 以上步骤默认已经完毕&#xff0c;毕竟只是记录pytorch的安装过程 3.查看个人电脑CUDA版本 winr 输入cmd 回车 输入指令 nvidia-smi 右上角为该电脑所支持的最高CUDA版本 输入命令 nvcc -V 图中即为该电脑所安装的CUDA版本 记住该版…

为什么安装了SSL证书还是不能HTTPS访问?

即便是正确安装了SSL证书&#xff0c;有时网站仍然无法通过HTTPS正常访问&#xff0c;这背后可能隐藏着多种原因。以下是一些常见的问题及解决方案&#xff0c;帮助您排查并解决这一困扰。 PC点此申请&#xff1a;SSL证书申请_https证书下载-极速签发 注册填写注册码230918&a…

文献解读-长读长测序-第十三期|《PrecisionFDA真相挑战第二版:利用短读长和长读长在难比对区域进行变异检测》

关键词&#xff1a;基因组&#xff1b;长读长测序&#xff1b;基准测试&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;PrecisionFDA Truth Challenge V2: Calling variants from short and long reads in difficult-to-map regions标题&#xff08;中文…

零基础光速入门AI绘画,SD保姆攻略

前言 大家好&#xff0c;我是AI绘画咪酱。一名AIGC狂热爱好者&#xff0c;目前正在AI绘画领域进行深入的探索。 我花了一个月时间把SD研究了一遍&#xff0c;秉持着用有趣、易懂的文字让小白也可以零基础光速使用SD&#xff08;stable diffusion&#xff09;入门AI绘画&#…

家政小程序的开发,带动市场快速发展,提高家政服务质量

当下生活水平逐渐提高&#xff0c;也增加了年轻人的工作压力&#xff0c;同时老龄化也在日益增加&#xff0c;使得大众对家政的需求日益提高&#xff0c;能力、服务质量高的家政人员能够有效提高大众的生活幸福指数。 但是&#xff0c;传统的家政服务模式存在着效率低、用户与…

Java语法系列 小白入门参考资料 逻辑控制

顺序结构 顾名思义&#xff0c;就是按着从上到下的顺序执行代码 public class Demo {public static void main(String[] args) {System.out.println("aaa");System.out.println("bbb");System.out.println("ccc");} }如果调整代码的书写顺序, …

手撕Transformer!!从每一模块原理讲解到代码实现【超详细!】

文章目录 一、位置编码位置编码的原理代码解释 二、多头注意力三、前馈神经网络&#xff08;FeedForward&#xff09;和层归一化&#xff08;NormLayer&#xff09;FeedForward 模块代码解析 NormLayer 模块代码解析 四、EncoderEncoder 类EncoderLayer 类前向传播过程 五、Dec…