洛谷P1043数字游戏题解--zhengjun

news/2024/11/8 9:06:06/

题目描述

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共 n n n个),你要按顺序将其分为 m m m个部分,各部分内的数字相加,相加所得的 m m m个结果对 10 10 10取模后再相乘,最终得到一个数 k k k。游戏的要求是使你所得的k最大或者最小。

例如,对于下面这圈数字( n = 4 , m = 2 n=4,m=2 n=4,m=2):

要求最小值时, ( ( 2 − 1 ) m o d 10 ) × ( ( 4 + 3 ) m o d 10 ) = 1 × 7 = 7 ((2-1) \bmod 10)×((4+3) \bmod 10)=1×7=7 ((21)mod10)×((4+3)mod10)=1×7=7,要求最大值时,为 ( ( 2 + 4 + 3 ) m o d 10 ) × ( − 1 m o d 10 ) = 9 × 9 = 81 ((2+4+3) \bmod 10)×(-1 \bmod 10)=9×9=81 ((2+4+3)mod10)×(1mod10)=9×9=81。特别值得注意的是,无论是负数还是正数,对 10 10 10取模的结果均为非负值。

丁丁请你编写程序帮他赢得这个游戏。

输入格式

输入文件第一行有两个整数, n ( 1 ≤ n ≤ 50 ) n(1≤n≤50) n(1n50) m ( 1 ≤ m ≤ 9 ) m(1≤m≤9) m(1m9)。以下 n n n行每行有个整数,其绝对值 ≤ 1 0 4 \le 10^4 104,按顺序给出圈中的数字,首尾相接。

输出格式

输出文件有 2 2 2行,各包含 1 1 1个非负整数。第 1 1 1行是你程序得到的最小值,第 2 2 2行是最大值。

输入输出样例

输入 #1 复制
4 2
4
3
-1
2
输出 #1 复制
7
81

思路

这题是一个典型的区间dp。

为了让一个环变成一条链,就可以把换剪开,在剪开的地方添加剪开前相连的数,然后就是把原数组翻了两倍,这样做dp就可以了,不过还要注意一下最终的答案要重新找一下。

f i , j , k f_{i,j,k} fi,j,k表示在 i i i j j j的区间中分成 k k k份所得的最大(最小)值。

转移公式:

f i , j , k = max ⁡ / min ⁡ { f i , t , k − 1 + s u m t + 1 , j m o d 10 } f_{i,j,k}=\max/\min\{f_{i,t,k-1}+sum_{t+1,j}\bmod10\} fi,j,k=max/min{fi,t,k1+sumt+1,jmod10}

i + k − 2 ≤ t < j , s u m i , j i+k-2\leq t<j,sum_{i,j} i+k2t<j,sumi,j表示从 i i i j j j段的总和

这个 s u m sum sum可以用前缀和处理出来

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;
int n,m;
int minf[101][101][10],maxf[101][101][10];
int a[101];
int mod(int x){return ((x%10)+10)%10;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i+n]=a[i];//翻两倍}for(int i=2;i<=2*n;i++)a[i]+=a[i-1];//前缀和for(int i=1;i<=2*n;i++)for(int j=i+1;j<=2*n;j++)for(int k=2;k<=j-i+1;k++)minf[i][j][k]=0x7fffffff;//初始值for(int i=1;i<=2*n;i++)for(int j=i;j<=2*n;j++)minf[i][j][1]=maxf[i][j][1]=mod(a[j]-a[i-1]);//不分的时候就是这段的和mod 10for(int i=2;i<=m;i++){//枚举分的段数for(int j=1;j<=2*n;j++){//枚举左端点for(int k=j+i-1;k<=2*n;k++){//枚举右端点for(int l=j+i-1-1;l<=k-1;l++){//枚举从哪里切一刀minf[j][k][i]=min(minf[j][k][i],minf[j][l][i-1]*mod(a[k]-a[l]));//注意这里的l已经是sum的左端点-1了maxf[j][k][i]=max(maxf[j][k][i],maxf[j][l][i-1]*mod(a[k]-a[l]));}}}}int minans=0x7fffffff,maxans=0;for(int i=1;i<=n;i++){//寻找答案minans=min(minans,minf[i][i+n-1][m]);maxans=max(maxans,maxf[i][i+n-1][m]);}printf("%d\n%d",minans,maxans);//输出return 0;
}

谢谢–zhengjun


http://www.ppmy.cn/news/911127.html

相关文章

小游戏 《唐僧大战白骨精》

##小游戏 《唐僧大战白骨精》 有点小无语的小游戏 当时做的还挺认真的 rint("欢迎光临 xxx 游戏&#xff01;\n""请选择你的身份&#xff1a;&#xff01;\n""1.唐僧\n""2.白骨精\n""-----------------") sfinput("请…

三只小猪的故事[漫画]

知道软件开发知识的人在我们这个社会只占极少数。而软件却几乎是所有人每天都有用到的东西。这种不平衡给我们的软件开发带来了很多的问题。 就比如我们承接的项目主要是政府机构提供的&#xff0c;这种项目来钱很快&#xff0c;但弊病是需方很强势&#xff0c;他们很少有懂得软…

独一无二的《斗罗大陆》小游戏火爆上线,玩家闯关等你来~(等级有点儿难)

前言 大家好&#xff01;我是梨子同学&#xff01; 希望大家多多支持我&#xff01;哈哈 为了感谢每一个关注我的小可爱&#xff1a;&#x1f493;每篇文章的项目源码都是无偿分享滴&#x1f493;&#x1f447;&#x1f447;&#x1f447;&#x1f447; 点这里蓝色这行字体自取…

经典三消游戏核心玩法

游戏引擎 - cocos creator 3.6 项目地址 three-tiles GitCode 核心逻辑代码 - assets/script/game/GameScene.ts import { _decorator, Component, Node, Prefab, assetManager, NodePool, instantiate, v3, Vec3, UITransform, game, tween, Animation, PageView, Label…

青龙 小猪

项目注册地址:http://t.zlnu.cn/5RXXVz?c211806 需要邀请码才能注册,接码注册不了 青龙中填入变量名 #猪赚 export soy_xzzq_data0&1582222222&22241582222222&2224 上面填 手机号&密码 多账号用 其中User-Agent为可选填写 定时任务 cron 0-59/2 * * * …

Docker安装tomcat

docker hub上面查找tomcat镜像 docker search tomcat 从docker hub上拉取tomcat镜像到本地 docker pull tomcat docker images查看是否有拉取到的tomcat docker images 使用tomcat镜像创建容器实例(也叫运行镜像) docker run -d -p 8080:8080 tomcat 说明 -p 小写&#xff0c;…

UE4/5C++多线程插件制作(四、线程绑定执行机制

目录 制作: RTPAgendy.h添加bool 更改的RTPAgendy.cpp文件【不要全部替换,里面只是修改了的函数放上去了】:

PV、UV、DAU、MAU、PCU、ARPU、KPI

PV: &#xff08;Page View&#xff09;访问量, 即页面浏览量或点击量&#xff0c;衡量网站用户访问的网页数量&#xff1b;在一定统计周期内用户每打开或刷新一个页面就记录1次&#xff0c;多次打开或刷新同一页面则浏览量累计。UV: &#xff08;Unique Visitor&#xff09;独…