都是泪呀。。。↑

题目传送门

题意(直接复制了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的原因吧。。。卡了半天,终于卡过去了。。。

具体详见代码:

代码

(我知道你要看这个)

  1. #include<bits/stdc++.h>
  2. using namespace std;//奇丑无比的码风
  3. int n,a[1010][1010],f[2][1010][1010],dp[2][1010][1010];
  4. int ans,qx,qy;
  5. bool ff;
  6. inline int get2(register int x,register int y){
  7. if(a[x][y]==0){return 0;} //特判
  8. register int pt=0;
  9. while(a[x][y]%2==0) ++pt,a[x][y]/=2; //卡常数
  10. return pt;
  11. }
  12. inline int get5(register int x,register int y){
  13. if(a[x][y]==0){return 0;} //特判
  14. register int pt=0;
  15. while(a[x][y]%5==0) ++pt,a[x][y]/=5; //卡常数
  16. return pt;
  17. }
  18. inline void print(register int k,register int x,register int y,register int first){
  19. if(x==1&&y==1) ;
  20. else if(x==1) print(k,x,y-1,0);
  21. else if(y==1) print(k,x-1,y,1);
  22. else if(dp[k][x][y]==dp[k][x-1][y]+f[k][x][y]) print(k,x-1,y,1);
  23. else print(k,x,y-1,0);
  24. if(first==6666) return ;
  25. putchar(first==0?'R':'D'); //一开始在n,n点时不需要输出
  26. return ;
  27. }
  28. int main(){
  29. while(cin>>n){
  30. ff=0;qx=0;qy=0;
  31. for(register int i=1;i<=n;i++){
  32. for(register int j=1;j<=n;j++){
  33. cin>>a[i][j];
  34. if(a[i][j]==0){
  35. qx=i;qy=j;
  36. ff=1;
  37. }
  38. }
  39. }
  40. for(register int i=1;i<=n;i++){
  41. for(register int j=1;j<=n;j++){
  42. f[0][i][j]=get2(i,j);
  43. f[1][i][j]=get5(i,j);
  44. }
  45. }
  46. memset(dp,63,sizeof(dp));
  47. for(register int i=1;i<=n;i++)
  48. for(register int j=1;j<=n;j++){
  49. dp[0][i][j]=min(dp[0][i][j],dp[0][i-1][j]);
  50. dp[0][i][j]=min(dp[0][i][j],dp[0][i][j-1]);//从左格子与上格子中取最小值
  51. if(i==1&&j==1) dp[0][i][j]=0;
  52. dp[0][i][j]+=f[0][i][j];
  53. }
  54. for(register int i=1;i<=n;i++)
  55. for(register int j=1;j<=n;j++){
  56. dp[1][i][j]=min(dp[1][i][j],dp[1][i-1][j]);
  57. dp[1][i][j]=min(dp[1][i][j],dp[1][i][j-1]);//从左格子与上格子中取最小值
  58. if(i==1&&j==1) dp[1][i][j]=0;
  59. dp[1][i][j]+=f[1][i][j];
  60. }
  61. ans=min(dp[0][n][n],dp[1][n][n]);//初步ans
  62. if(ans>1&&ff==1){ //特判有0的情况,如果有0,那么答案只有0或1.
  63. putchar('1');
  64. putchar('\n');
  65. for(register int i=1;i<qx;i++) putchar('D');
  66. for(register int i=1;i<qy;i++) putchar('R');
  67. for(register int i=qx;i<n;i++) putchar('D');
  68. for(register int i=qy;i<n;i++) putchar('R');
  69. putchar('\n');
  70. }else{
  71. cout<<ans;
  72. putchar('\n');
  73. if(dp[0][n][n]<dp[1][n][n]) print(0,n,n,6666); //分2、5讨论
  74. else print(1,n,n,6666);
  75. putchar('\n');
  76. }
  77. }
  78. return 0;
  79. }

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. NFS服务端+客户端配置

    一.Server端配置 1.下载rpcbind和nfs #yum install -y rpcbind nfs-utils 2.创建共享文件并授权 创建共享文件夹 #mkdir /server-nfs ...

  2. UVALive 7505 Hungry Game of Ants (2015Ecfinal)

    题意: 长度是n的线段上点的编号从1~n,每个点有一只蚂蚁蚂蚁的体重等于该点的编号,最初每只蚂蚁可以选择向右走或者向左走两只蚂蚁相遇时体重大的吃掉体重小的并且体重增加为两只的体重和,走到边界时掉头,问 ...

  3. 阿里云上部署了zabbix,突然无法收到报警邮件的解决办法

    在阿里云上部署了zabbix,一直能正常接收到zbx发来的报警邮件(报警邮箱是163的),不知是什么原因,突然无法接收到报警邮件了. 但在服务器上手动执行echo "hello"| ...

  4. 利用ImageOps调整图片的Aspect Ratio(给图片添加borders)

    # -*- coding: utf-8 -*- #******************** # 改变图片的纵横比(aspect retio) # 使用ImageOps.expand() # Image ...

  5. NATS_05:NATS服务器部署

    1.NATS安装前的普及 NATS 的服务器是使用 GoLang 语言开发的,其可执行文件的名字为:gnatsd,表示:Go NATS Daemon.NATS服务器是一个开源软件,基于 MIT 许可证 ...

  6. webpack+vue+iview使用vue-cli脚手架搭建

    1.安装nodejs环境 下载node.js.安装成功后再控制台输入 node -v 出现版本号则,安装成功. 如果没有出现 版本号 而是出现node 不是内部命令的话 需要配置一下环境变量,如果已经 ...

  7. 完美解决github访问速度慢

    1. 解决方法 2.解决方法 1. 修改本地hosts文件 windows系统的hosts文件的位置如下:C:\Windows\System32\drivers\etc\hosts mac/linux ...

  8. bzoj千题计划139:bzoj2229: [Zjoi2011]最小割

    http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...

  9. 在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果

    在 iPad 上试验从用算法生成法线贴图-到法线映射光照效果 目录 概述 一般来说, 法线贴图是用高模的法线图, 低模的纹理图, 来生成较好的渲染效果. 而法线图通常是通过图像处理软件来生成的, 这里 ...

  10. 六、Kafka 用户日志上报实时统计之分析与设计

    一.项目整体概述 简述项目的背景 背景:用户行迹企业运营 分析项目的目的 通过对项目的分析,可以初步得到以下目的: •实时掌握用户动态 •根据实时统计结果,适度推广 •统计分析效果,快速合理的调整 二 ...