都是泪呀。。。↑

题目传送门

题意(直接复制了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 题解的更多相关文章

  1. Codeforces Round #556 题解

    Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...

  2. LibreOJ β Round #2 题解

    LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...

  3. Codeforces Round #569 题解

    Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...

  4. Codeforces Round #557 题解【更完了】

    Codeforces Round #557 题解 掉分快乐 CF1161A Hide and Seek Alice和Bob在玩捉♂迷♂藏,有\(n\)个格子,Bob会检查\(k\)次,第\(i\)次检 ...

  5. CF2B The least round way(贪心+动规)

    题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...

  6. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  7. Google kickstart 2022 Round A题解

    Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...

  8. 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]中有多少个数 ...

  9. “玲珑杯”ACM比赛 Round #12题解&源码

    我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧!                                     A ...

随机推荐

  1. 特征选择实践---python

    作者:城东链接:https://www.zhihu.com/question/28641663/answer/110165221来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  2. Java入门:基础算法之产生随机数

    本程序演示使用Random类的呢想tInt()方法产生随机数. /* Program: 随机数发生器 * Written by: 理工云课堂 * Input: None * Output: 0 到20 ...

  3. Zabbix应用二:Zabbix添加监控主机

    Zabbix添加被监控主机 一.选择中文语言 Zabbox3.0默认支持中文,可以登录后,点击右上角的用户图标,然后在语言中选择中文即可. 二.添加被监控主机 1.选择'配置'->'主机',然后 ...

  4. P3942 将军令

    P3942 将军令 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫.小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务. 不过 ...

  5. jQuery读取KindEditor的值

    $(document.getElementsByTagName("iframe")[0].contentWindow.document.body).html();

  6. day10 浅谈面向对象编程

    面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的.   第四步概括动词设计成方法.动作的产生往往 ...

  7. python3.6.4的importlib模块重载用法

    了解:模块的重载 考虑到性能的原因,每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块, 有的同学可能会想到直 ...

  8. Java并发编程原理与实战二十五:ThreadLocal线程局部变量的使用和原理

    1.什么是ThreadLocal ThreadLocal顾名思义是线程局部变量.这种变量和普通的变量不同,这种变量在每个线程中通过get和set方法访问, 每个线程有自己独立的变量副本.线程局部变量不 ...

  9. 当今最流行的Web项目管理工具精选

    代码管理 以前各种开源项目的代码都是通过博客和个人网页来发布的.这种分享方式并不是最容易的一种,也不便于他人对代码做出贡献.下面是几个管理项目代码的工具,不管对于个人开发者还是团队开发者来说,它们都是 ...

  10. springboot中使用Scheduled定时任务

    一:在程序入口类中添加注解@EnableScheduling @SpringBootApplication @EnableScheduling public class DemoApplication ...