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 ...
随机推荐
- BZOJ 3771 母函数裸题
题目描述 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: “这把斧头,是不是你的?” 樵夫一看:“是啊是啊!” 水神把斧头扔在一边,又拿起一个 ...
- IL指令集
声明: 1.本指令集搜集自网上各个论坛帖子,欢迎补充 IL指令集 名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推 ...
- 【Asp.net入门15】第一个Asp.net应用程序-输入验证
前言 所谓输入验证,顾名思义就是验证用户输入符不符合要求.前面我们已经完成了这个简单的应用程序,但还有一个问题需要解决:用户可以在Default.aspx窗体中 提交任何数据,甚至可以提交根本不包含任 ...
- java字节码文件 helloworld
Java代码 \\A.java public class A{} 1 2 1 2 javac A.java \\得到 A.class javap -v A.class 下面是javap工具帮我们生成的 ...
- HDU 2814 斐波那契循环节 欧拉降幂
一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...
- IT人应当知道的10个行业小内幕
如果你打算从事IT行业或刚进入这个行业,也许本文下面的小内幕会吓到你,因为这些事平常都不会公开讨论的.如果你是IT资深人士,或许你已经遇到其中的大部分了.如果你愿意,请一起来参与讨论吧. 这些内幕大多 ...
- 20155307 2016-2017-2 《Java程序设计》第6周学习总结
20155307 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 串流数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取出,可以使用输入串流:如果 ...
- 点击搜索条件提交form表单
思路:点击搜索,javascript跳转提交方法,提交整个表单. //组员下拉框选择分组事件 $('#s-member').change(function(){ $('#logForm').submi ...
- Shell脚本-自动化部署反向代理、WEB、nfs
部署nginx反向代理三个web服务,调度算法使用加权轮询(由于物理原因只开启两台服务器) AutoNginxNfsService.sh #/bin/bash systemctl status ngi ...
- host映射方法
host映射: host是根据TCP/IP for Windows 的标准来工作的,它的作用是包含IP地址和Host name(主机名)的映射关系,是一个映射IP地址和Host name(主机名)的规 ...