CF2B The least round way 题解
都是泪呀。。。↑
题目传送门
题意(直接复制了QWQ)
题目描述
给定由非负整数组成的\(n \times n\)的正方形矩阵,你需要寻找一条路径:
以左上角为起点,
每次只能向右或向下走,
以右下角为终点 并且,如果我们把沿路遇到的数进行相乘,积应当是最小“round”,换句话说,应当以最小数目的0的结尾.
输入格式
第一行包含一个整数 \((2 \leq n \leq 1000)\),\(n\)为矩阵的规模,接下来的\(n\)行包含矩阵的元素(不超过\(10^9\)的非负整数).
输出格式
第一行应包含最小尾0的个数,第二行打印出相应的路径(译注:D为下,R为右)
思路
楼下其实说得蛮清楚了,我主要就是说一下坑。。。
构成末尾是0的只能是\(2^a\)与\(5^b\)相乘,所得的0的个数为\(min(a,b)\),所以,只要2、5分别dp一遍,取一下上与左的最小值就好啦。。。最后求路径时递归求一遍就好啦。。。
坑
TLE的小朋友们看这里啦。。。
TLE的小朋友们看这里啦。。。
TLE的小朋友们看这里啦。。。
(重要的事情说三遍)
此题特别会卡时。
比如说一开始预处理每个数是\(2^a\)与\(2^b\)时,需要将此数不间断地除下去,为什么呢?因为卡常数。。。也许时我RP的原因吧。。。卡了半天,终于卡过去了。。。
具体详见代码:
代码
(我知道你要看这个)
#include<bits/stdc++.h>
using namespace std;//奇丑无比的码风
int n,a[1010][1010],f[2][1010][1010],dp[2][1010][1010];
int ans,qx,qy;
bool ff;
inline int get2(register int x,register int y){
if(a[x][y]==0){return 0;} //特判
register int pt=0;
while(a[x][y]%2==0) ++pt,a[x][y]/=2; //卡常数
return pt;
}
inline int get5(register int x,register int y){
if(a[x][y]==0){return 0;} //特判
register int pt=0;
while(a[x][y]%5==0) ++pt,a[x][y]/=5; //卡常数
return pt;
}
inline void print(register int k,register int x,register int y,register int first){
if(x==1&&y==1) ;
else if(x==1) print(k,x,y-1,0);
else if(y==1) print(k,x-1,y,1);
else if(dp[k][x][y]==dp[k][x-1][y]+f[k][x][y]) print(k,x-1,y,1);
else print(k,x,y-1,0);
if(first==6666) return ;
putchar(first==0?'R':'D'); //一开始在n,n点时不需要输出
return ;
}
int main(){
while(cin>>n){
ff=0;qx=0;qy=0;
for(register int i=1;i<=n;i++){
for(register int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]==0){
qx=i;qy=j;
ff=1;
}
}
}
for(register int i=1;i<=n;i++){
for(register int j=1;j<=n;j++){
f[0][i][j]=get2(i,j);
f[1][i][j]=get5(i,j);
}
}
memset(dp,63,sizeof(dp));
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++){
dp[0][i][j]=min(dp[0][i][j],dp[0][i-1][j]);
dp[0][i][j]=min(dp[0][i][j],dp[0][i][j-1]);//从左格子与上格子中取最小值
if(i==1&&j==1) dp[0][i][j]=0;
dp[0][i][j]+=f[0][i][j];
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++){
dp[1][i][j]=min(dp[1][i][j],dp[1][i-1][j]);
dp[1][i][j]=min(dp[1][i][j],dp[1][i][j-1]);//从左格子与上格子中取最小值
if(i==1&&j==1) dp[1][i][j]=0;
dp[1][i][j]+=f[1][i][j];
}
ans=min(dp[0][n][n],dp[1][n][n]);//初步ans
if(ans>1&&ff==1){ //特判有0的情况,如果有0,那么答案只有0或1.
putchar('1');
putchar('\n');
for(register int i=1;i<qx;i++) putchar('D');
for(register int i=1;i<qy;i++) putchar('R');
for(register int i=qx;i<n;i++) putchar('D');
for(register int i=qy;i<n;i++) putchar('R');
putchar('\n');
}else{
cout<<ans;
putchar('\n');
if(dp[0][n][n]<dp[1][n][n]) print(0,n,n,6666); //分2、5讨论
else print(1,n,n,6666);
putchar('\n');
}
}
return 0;
}
CF2B The least round way 题解的更多相关文章
- Codeforces Round #556 题解
Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...
- LibreOJ β Round #2 题解
LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...
- Codeforces Round #569 题解
Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...
- Codeforces Round #557 题解【更完了】
Codeforces Round #557 题解 掉分快乐 CF1161A Hide and Seek Alice和Bob在玩捉♂迷♂藏,有\(n\)个格子,Bob会检查\(k\)次,第\(i\)次检 ...
- CF2B The least round way(贪心+动规)
题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...
- CFEducational Codeforces Round 66题解报告
CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...
- Google kickstart 2022 Round A题解
Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- “玲珑杯”ACM比赛 Round #12题解&源码
我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧! A ...
随机推荐
- springcloud的分布式配置Config
1.为什么要统一配置管理? 微服务由多个服务构成,多个服务多个配置,则对这些配置需要集中管理.不同环境不同配置,运行期间动态调整,自动刷新. 统一管理微服务的配置:分布式配置管理的一些组件: zook ...
- C++中的空类,编译器默认可以产生哪些成员函数
C++中的空类,编译器默认可以产生哪些成员函数 C++中创建一个空类:class Empty {};默认会生成4个函数,其函数的原型如下: public: Empty() { ... } Empty( ...
- libcurl代码示例
http://note.youdao.com/noteshare?id=e60a679d1731c870ff45e403de81a2c0
- Java入门:基础算法之计算园的面积
本部分内容介绍如何使用Java计算圆的周长和面积.分两种方法来实现: 1)圆的半径由用户输入 2)圆的半径由程序指定 代码1: /** * @作者: 理工云课堂 * @描述: 用户输入圆的半径,程序结 ...
- 关于dubbo的架构
dubbo是国内一个十分受欢迎的分布式rpc框架. 这篇博客是从dubbo官网出发,来说明下dubbo的技术架构.首先我们看下官网的架构图. 节点角色说明: Provider: 暴露服务的服务提供方. ...
- python---CMDB配置管理数据库
前戏:项目目的 是一个运维自动化管理项目: 为了减少人工干预,降低人员成本 ---资产管理 --操作管理 避免人员直接操作服务器,使用后台去统一操作 一:实现方式 (一)Agent基于shell命令实 ...
- Nginx记录-Nginx介绍
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 ...
- Mongodb 笔记04 特殊索引和集合、聚合、应用程序设计
特殊索引和集合 1. 固定集合:固定集合需要事先创建好看,而且它的大小是固定的.当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除. 2. 创建固定集合:db.createC ...
- Java消息队列三道面试题详解!
面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...
- 2017 清北济南考前刷题Day 2 morning
期望得分:100+30+60=190 实际得分:100+30+30=160 T1 最优方案跳的高度一定是单调的 所以先按高度排序 dp[i][j] 跳了i次跳到j 枚举从哪儿跳到j转移即可 #incl ...