第五届传智杯【初赛】- F-二人的大富翁游戏

news2025/1/21 4:44:41

F-二人的大富翁游戏

题目预览

image-20221127112043546

image-20221127112052373

题目背景(推荐阅读 题目预览)

如果遇到提交失败,请多次刷新,多次提交,会有成功几率

作为大学生,莲子和梅莉有着比高中时更为闲暇的课余时光。在没有课的时候,她们喜欢玩大富翁这一游戏,在游玩过程中交流自己的喜怒哀乐。

如图所示,是一个 n = 10 n=10 n=10 的大富翁地图。玩家在圆格子上行动。而方格子则可以建造建筑物。每个圆格子唯一对应一个方格子。

(友情提示:赌博是不对的)

题目描述

莲子和梅莉在玩大富翁游戏。这个大富翁游戏是由传智播客定制的,与一般的大富翁游戏在玩法上有略微区别,因此也被称为传智大富翁。

大富翁游戏是由 n n n 个格子组成,编号逆时针地从 1 , 2 , … , n 1,2,\dots,n 1,2,,n,构成了一个环。莲子和梅莉起始在编号为 1 1 1 的格子。莲子和梅莉最开始都有 m m m 元资金。每一个回合,莲子先投掷骰子,再是梅莉投掷骰子。每一方行动时,设骰子最上面的数字为 k k k,则行动方逆时针移动 k k k 步。在移动的过程中,行动者所经过的每一个格子应当都分为两种情况:

  • 如果当前格子(假设编号为 i i i)上有建筑物,而且建筑物是自己的,则行动方可以获得额外的 a i a_i ai 元资金。
  • 如果当前格子上有建筑物,但是建筑物是对方的,则行动方要将自己的 a i a_i ai 元资金转移给对方。

在行动结束后亦有两种情况:

  • 如果当前格子(设编号为 i i i)上没有建筑物,则行动方可以选择花费 C i , 0 C_{i,0} Ci,0 元资金(前提要求行动者当前的资金大于等于 C i , 0 C_{i,0} Ci,0)搭建建筑物,此时 a i a_i ai 被初始化为 C i , 0 C_{i,0} Ci,0
  • 如果当前格子的建筑物是行动方的,假设当前是一座 j j j 等级的建筑物,那么行动方可以选择用 C i , j C_{i,j} Ci,j 元为建筑物升级,功效是使得 a i ← a i + C i , j a_i \gets a_i+C_{i,j} aiai+Ci,j。这里, C i , j C_{i,j} Ci,j 表示将第 i i i 个格子上的第 j j j 等级的建筑物升级到第 j + 1 j+1 j+1 等级的建筑物所需花费的资金。同一回合内可以多次升级建筑。特别地,建筑物的等级上限为 L L L。如果当前建筑物等级已经到达上限则无法升级。
  • 在所有建筑操作结束后,操作权转移给另一方。

两人都操作完一轮回合后,圆环上的每个建筑物都会提供给拥有者资金,具体来说,第 i i i 格上的建筑物会给其拥有者提供 d i d_i di 的资金。游戏结束当且仅当存在一个人在它行动过程中或者结束时的资金为负数。此时这个人成为输家(换而言之,允许中途过程资金为 0 0 0)。

给定莲子和梅莉的 q q q 个回合的每次操作,请问谁会是输家呢?

输入格式

第一行输入四个正整数 n , m , q , L n,m,q,L n,m,q,L,表示格子数、初始资金、回合次数和建筑物等级上限。

第二行开始,往下 n n n 行,每行输入 L L L 个正整数,表示 C i , j C_{i,j} Ci,j,其中 j j j 是从 0 0 0 L − 1 L-1 L1

( n + 2 ) (n+2) (n+2) 行输入 n n n 个正整数表示 d i d_i di

( n + 3 ) (n+3) (n+3) 行开始,往下若干行,每行只会有两种可能的情况:

  • 1   k \texttt{1 k} 1 k,表示当前行动方投掷了骰子,最上面的点数是 k k k。之后行动者会逆时针移动 k k k 步。
  • 2   k \texttt{2 k} 2 k,表示当前行动方在当前位置建造或者升级了建筑物共 k k k 次。
    • 在此过程中,当前位置已经有了对方建筑物则忽略此操作;
    • 如果资金不够升级 k k k 次,则只升级到资金允许范围内的最高等级;
    • 在此过程中,如果进行下一次升级,建筑物等级超过 L L L,则后续的所有升级忽略处理。

特别地,规定除了第一次外,每次 1   k \texttt{1 k} 1 k 操作出现时意味着行动者的切换。也就是说,第一次输入 1   k \texttt{1 k} 1 k 操作时,行动方是莲子,第二次是梅莉,第三次是莲子……以此类推。值得注意的是, 2   k \texttt{2 k} 2 k 操作出现并不会切换行动者。

此外,保证每个 1 \bm 1 1 操作后面最多跟随 1 \bm 1 1 2 \bm 2 2 操作

输出格式

如果已经分出了输赢,则输出谁是输家(如果莲子输,则输出 Renko \texttt{Renko} Renko;如果梅莉输,则输出 Merry \texttt{Merry} Merry);

如果没有分出输赢,则按照先莲子,后梅莉的顺序输出她们现在有的资金数。

样例 #1

样例输入 #1

6 40 5 3
10 20 30
15 25 35
6 8 12
6 12 18
8 16 24
8 12 40
1 2 3 4 5 6
1 4
2 3
1 2
2 5
1 3
1 2
2 1
1 5
2 3
1 3
2 4
1 4
1 6
2 2
1 3
2 1
1 3
2 1

样例输出 #1

Merry

样例 #2

样例输入 #2

6 9961 5 3
10 20 30
15 25 35
6 8 12
6 12 18
8 16 24
8 12 40
1 2 3 4 5 6
1 4
2 3
1 2
2 5
1 3
1 2
2 1
1 5
2 3
1 3
2 4
1 4
1 6
2 2
1 3
2 1
1 3
2 1

样例输出 #2

10099 9946

提示

【样例解释 1】

第一回合,莲子首先走 4 4 4 步,到达编号为 5 5 5 的格子,同时尝试建造与升级 3 3 3 次第五个格子的建筑物,但是 C 5 , 0 + C 5 , 1 + C 5 , 2 = 48 C_{5,0}+C_{5,1}+C_{5,2}=48 C5,0+C5,1+C5,2=48,所以只能把建筑物造到 2 2 2 级。此时莲子手上还有 16 16 16 元。
接着梅莉走了两步,到达编号为 3 3 3 的格子,同时尝试建造与升级 5 5 5 次第三个格子的建筑物, C 3 , 0 + C 3 , 1 + C 3 , 2 = 26 C_{3,0}+C_{3,1}+C_{3,2}=26 C3,0+C3,1+C3,2=26,而造五次会超过等级上限 L L L,因此只能升到 3 3 3 次,此时梅莉手上还有 14 14 14 元。
回合结束后每个建筑物都会提供给拥有者 d i d_i di 的资金,也就是说莲子此时手上有 21 21 21 元,梅莉手上有 17 17 17 元。
第二回合,莲子首先走 3 3 3 步,到达编号为 1 1 1 的格子。梅莉接着走 2 2 2 步,到达编号为 5 5 5 的格子,收取 a i a_i ai 元。而 a i = 24 a_i=24 ai=24,因此梅莉的资金被扣成了负数,从而输出 Merry \texttt{Merry} Merry

【样例解释 2】

仅在初始资金与第一组样例有一定变化,因此在这些回合中无法决出胜负,因此输出两人手上现有的资金。

【数据范围】

对于所有数据,保证 1 ≤ n , L ≤ 100 1 \leq n,L\leq 100 1n,L100 1 ≤ q ≤ 1 0 4 1 \leq q \leq 10^4 1q104 1 ≤ m , C i , j , d i ≤ 1 0 6 1 \leq m,C_{i,j},d_i \leq 10^6 1m,Ci,j,di106 1 ≤ k ≤ 1 0 3 1 \leq k \leq 10^3 1k103(你可以不必在意怎么获得一个 k k k 面的骰子)。数据保证 1 1 1 操作次数恰好为 2 × q 2\times q 2×q

题解

image-20221127112151660

参考代码

  • 版本1:

    #include<bits/stdc++.h>
    #define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
    #define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
    using namespace std;
    typedef long long i64;
    const int INF = 2147483647;
    int qread(){
        int w=1,c,ret;
        while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';
        while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';
        return ret * w;
    }
    int n, m, q, maxl; bool o = 1;
    const int MAXN = 100 + 3;
    int C[MAXN][MAXN], A[MAXN], D[MAXN], L[MAXN], O[3], T[MAXN];
    i64 M[2];
    int main(){
        n = qread(), m = qread(), q = qread(), maxl = qread();
        M[0] = M[1] = m, O[0] = O[1] = 1;
        up(1, n, i) L[i] = 0, T[i] = -1;
        up(1, n, i)
            up(0, maxl - 1, j) C[i][j] = qread();
        up(1, n, i) D[i] = qread();
        for(int op, k;~scanf("%d%d", &op, &k);){
            if(op == 1){
                if(o == 1){
                    up(1, n, i) if(T[i] != -1) M[T[i]] += D[i];
                }
                o ^= 1;
                up(1, k, i){
                    O[o] = (O[o]) % n + 1;
                    int p = O[o];
                    if(T[p] ==  o) M[o] += A[p]; else 
                    if(T[p] == !o){
                        M[!o] += A[p], M[o] -= A[p];
                        if(M[o] < 0)
                            puts(o ? "Merry" : "Renko"), exit(0);
                    }
                }
            } else {
                int p = O[o];
                while(k && L[p] < maxl && M[o] >= C[p][L[p]] && T[p] != !o){
                    A[p] += C[p][L[p]], M[o] -= C[p][L[p]];
                    ++ L[p], T[p] = o, -- k;
                }
            }
        }
        up(1, n, i) if(T[i] != -1) M[T[i]] += D[i];
        printf("%lld %lld\n", M[0], M[1]);
        return 0;
    }
    
  • 版本2:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <cctype>
    #include <queue>
    
    using namespace std;
    
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
        while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    
    int n,m,q,L,C[105][105],d[105],a[105],lv[105],pos[2],belong[105];
    
    long long money[2];
    
    const string name[2]={"Renko","Merry"};
    
    inline void putfail(int id)
    {
        cout << name[id] << endl;
        exit(0);
    }
    
    inline void forward(int id,int k)
    {
        for (int i=1;i<=k;i++)
        {
            int &p=pos[id];
            p++;
            if (p>n)
                p-=n;
            if (belong[p]==id)
                money[id]+=a[p];
            else if (belong[p]==(id^1))
            {
                money[id]-=a[p];
                money[id^1]+=a[p];
            }
            if (money[id]<0)
                putfail(id);
        }
    }
    
    inline void build(int id,int k)
    {
        int p=pos[id],cost=C[p][lv[p]];
        for (int i=1;(money[id]>=cost && lv[p]<L && (belong[p]==-1 || belong[p]==id) && i<=k);i++)
        {
            belong[p]=id;
            money[id]-=cost;
            a[p]+=cost;
            cost=C[p][++lv[p]];
        }
    }
    
    int main()
    {
        n=read(),m=read(),q=read(),L=read();
        for (int i=1;i<=n;i++)
        {
            for (int j=0;j<L;j++)
                C[i][j]=read();
        }
        for (int i=1;i<=n;i++)
            d[i]=read();
        pos[0]=pos[1]=1;
        fill(belong+1,belong+n+1,-1);
        money[0]=money[1]=m;
        for (int i=0;i<2*q;i++)
        {
            int op=read();
            begin:
            for (int j=1;j<=n && !(i&1);j++)
            {
                if (belong[j]==0)
                    money[0]+=d[j];
                else if (belong[j]==1)
                    money[1]+=d[j];
            }
            int k=read();
            forward(i&1,k);
            if (i==2*q-1)
                break;
            op=read();
            if (op==1)
            {
                i++;
                goto begin;
            }
            else
            {
                k=read();
                build(i&1,k);
            }
        }
    
        for (int j=1;j<=n;j++)
        {
            if (belong[j]==0)
                money[0]+=d[j];
            else if (belong[j]==1)
                money[1]+=d[j];
        }
    
        cout << money[0] << " " << money[1] << endl;
        return 0;
    }
          {
                k=read();
                build(i&1,k);
            }
        }
    
        for (int j=1;j<=n;j++)
        {
            if (belong[j]==0)
                money[0]+=d[j];
            else if (belong[j]==1)
                money[1]+=d[j];
        }
    
        cout << money[0] << " " << money[1] << endl;
        return 0;
    }
    

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

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

相关文章

08.OpenWrt-连接wifi网络

08.OpenWrt-连接wifi网络 8.1 连接其他wifi热点上网 rootOpenWrt:/# cat /etc/config/wireless config wifi-device ‘radio0’ option type ‘mac80211’ option path ‘platform/10300000.wmac’ option channel ‘1’ option band ‘2g’ option htmode ‘HT20’ option …

NFIQ怎么使用?NFIQ2.0软件怎么操作来进行图片质量得分计算?NFIQ2.0支持什么图片格式

一、背景 前段时间准备写个指纹图像生成论文&#xff0c;结果需要用NFQI进行分析,参考的论文中都是结果&#xff0c;还是折线图&#xff0c;看着好厉害&#xff0c;但论文中没有说明具体咋出来的值。网上找了半天相关的&#xff0c;一个有用的信息都没有&#xff0c;好不容易找…

一文带你学透Java Servlet(建议收藏)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端开发者…

【滤波跟踪】扩展卡尔曼滤波的无人机路径跟踪【含Matlab源码 2236期】

⛄一、EKF算法简介 扩展卡尔曼滤波是利用泰勒级数展开方法将非线性滤波问题转化成近似的线性滤波问题,利用线性滤波的理论求解非线性滤波问题的次优滤波算法。其系统的状态方程和量测方程分别如式(1)、式(2)所示: 式中,X(k)为n维的随机状态向量序列,Z(k)为n维的随机量测向量序…

【图像处理】基于图像聚类的无监督图像排序问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

推荐算法高级案例-通过WideDeep算法进行特征组合的商品推荐详细教程 代码+数据

案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。 方法概述:…

R语言与RStudio的下载与安装方法

本文介绍R语言及其集成开发环境RStudio的下载、安装方法。 R语言是一个属于GNU操作系统的开源软件&#xff0c;在数据统计与分析、可视化等方面具有优秀的表现&#xff1b;而RStudio则是R语言的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可以帮助我们更好地编辑、调…

《PyTorch深度学习实战》学习小结

前言 PyTorch是Facebook发布的一款非常具有个性的深度学习框架&#xff0c;它和Tensorflow&#xff0c;Keras&#xff0c;Theano等其他深度学习框架都不同&#xff0c;它是动态计算图模式&#xff0c;其应用模型支持在运行过程中根据运行参数动态改变&#xff0c;而其他几种框架…

【Mysql】内置函数

文章目录内置函数日期函数字符串函数数学函数其他函数内置函数 内置函数一般放在SQL语句里帮助我们执行一些逻辑. 日期函数 函数名称描述current date()获取当前日期current time()获取当前时间current_timestamp()获取当前时间戳date(datetime)返回 datetime 参数的日期部分…

Unity演示Leetcode开香槟过程

文章目录Unity演示Leetcode开香槟过程示意图一&#xff1a;示意图二&#xff08;速度变为上图的5倍&#xff09;主要步骤与难点C#脚本代码&#xff1a;香槟杯子液体页面变化以及杯子边缘的绘画Shader代码杯子边缘液体流出的效果的Shader代码&#xff1a;Unity演示Leetcode开香槟…

shell中的printf实践:美颜的九九乘法表

一 简介 Linux系统中除了echo命令可以输出信息&#xff0c;还可以使用printf命令实现相同的效果。功能描述&#xff1a;printf命令可以格式化输出数据。printf命令的语法格式如下。 printf [格式] 参数 常用的格式字符串及功能描述下表&#xff1a; 应用案例&#xff1a; 输出…

配置anaconda环境变量

conda环境变量的配置配置环境变量找到anaconda安装位置打开环境变量配置设置输入python命令跳入商店问题总结配置环境变量 找到anaconda安装位置 首先下载好conda环境&#xff0c;例如我下载在D盘 打开环境变量配置设置 可以按winS进入搜索框&#xff0c;输入环境变量&…

PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 1--前言 ① 创建两个线程&#xff0c;主线程为ui线程&#xff0c;子线程用于读取摄像头视频&#xff0c;将处理后的图像帧数据&#xff08;处理操作可以…

开放域类型发现:Open Relation and Event Type Discovery with Type Abstraction

1 什么是type discovery? “relation discovery” (Yao et al., 2011; Marcheggiani and Titov, 2016),“open relation extraction” (Wu et al., 2019; Hu et al., 2020) and “event type induction” (Huang and Ji, 2020; Shen et al., 2021). In this paper, we unify …

[项目](美多商城)(数据库课设/软件工程大作业/软件工程课设)项目的创建、配置、说明文档与源码

文章目录&#x1f498; 相关说明&#x1f498; 美多商城前台前端项目创建与配置&#x1f496; 项目的创建&#x1f496; 配置UI组件库&#x1f49d; 安装&#x1f49d; 全局引入与全局注册&#x1f49d; 局部引入与局部注册&#x1f49d; 定制主题&#x1f496; 配置axios&…

【并发】Java并发线程池底层原理详解与源码分析(上)

【并发】Java并发线程池底层原理详解与源码分析&#xff08;上&#xff09; 线程池与线程对比 使用线程的方式运行 使用线程池的方式运行 分析 单线程、多线程、线程池效率问题 详细代码 结果分析 单线程为什么是最快的&#xff1f; 单线程都这么快了&#xff0c;我…

第四周 牛背山云海——拍拍大场景,自拍延时片段

目录4.1 面对广阔云海拍张全景照片&#xff0c;再来一组延时片段4.2 认识镜头滤镜4.3 补充技术基础知识&#xff1a;白平衡、色温4.4 小博士课堂——延时摄影课件4.1 面对广阔云海拍张全景照片&#xff0c;再来一组延时片段 云海 雪山 雅安境内的牛背山拍摄云海 牛背山可以看到…

java刷题day 04

一. 单选题&#xff1a; 解析&#xff1a;队列&#xff1a;先到先服务解析&#xff1a;final不能修饰接口&#xff0c;成员变量可以用final修饰 解析&#xff1a; A&#xff1a; 算法是指解题方案的准确而完整的描述&#xff0c;算法不等于程序&#xff0c;也不等于计算方法 BC…

Linux 时间同步 ntpdchrony 内网

Linux 时间同步 ntpd&chrony 在任何服务器集群中&#xff0c;为了更好的协同工作&#xff0c;除了一些互信机制外&#xff0c;需要的就是时间同步功能&#xff0c;如果时间不同步&#xff0c;就好比让在中国的同事与美国的同事进行沟通&#xff0c;会造成各种奇奇怪怪的时…

excel笔记

1.快速填充 当需要提取出电子邮件里的名称&#xff0c;可以在第一行里手动输入Nancy后&#xff0c;直接按快捷键ctrl e进行快速填充&#xff0c;可以直接获得预期数据 如果不用快捷键&#xff0c;也可以点击指定位置的图标&#xff0c;实现这一功能 快速填充不仅可以将进行…