这个2B题还好~~



题目大意:

给出一个矩阵。从左上走到右下,仅仅能往右或下走。路径中每一个格子有一个数。这些数相乘得出一个数。

求这个数末尾零最少的一条路径。



解题思路:



找出一条路径。乘积得数中素因子2的个数最少,再找出一个素因子5最少, 比較两个输出最小的。

有意外情况就是有数为零。这样的情况把零当成10跑一遍,假设素因子最少为0。输出路径,假设不是,输出经过零的路径。





以下是代码:

#include <set>
#include <map>
#include <queue>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <cctype>
#include <algorithm> #define eps 1e-10
#define pi acos(-1.0)
#define inf 107374182
#define inf64 1152921504606846976
#define lc l,m,tr<<1
#define rc m + 1,r,tr<<1|1
#define zero(a) fabs(a)<eps
#define iabs(x) ((x) > 0 ? (x) : -(x))
#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (min(SIZE,sizeof(A))))
#define clearall(A, X) memset(A, X, sizeof(A))
#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))
#define memcopyall(A, X) memcpy(A , X ,sizeof(X))
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) ) using namespace std; int dp[1005][1005][2];
int cnt[1005][1005][2];
int pre[1005][1005][2]; void output(int x,int y,int num)
{
if(x==0&&y==0)return ;
if(pre[x][y][num]==0)
{
output(x,y-1,num);
printf("R");
}
else
{
output(x-1,y,num);
printf("D");
}
} int main()
{
int input,n,x=-1,y=-1;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d",&input);
if(input==0)
{
cnt[i][j][0]=1;
cnt[i][j][1]=1;
x=i;
y=j;
continue;
}
cnt[i][j][0]=0;
while(input%2==0)
{
cnt[i][j][0]++;
input/=2;
}
cnt[i][j][1]=0;
while(input%5==0)
{
cnt[i][j][1]++;
input/=5;
}
}
}
clearall(pre,-1);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==0)
{
if(j==0)
{
dp[0][0][0]=cnt[0][0][0];
dp[0][0][1]=cnt[0][0][1];
}
else
{
dp[0][j][0]=cnt[0][j][0]+dp[0][j-1][0];
dp[0][j][1]=cnt[0][j][1]+dp[0][j-1][1];
pre[0][j][0]=0;
pre[0][j][1]=0;
}
}
else if(j==0)
{
dp[i][0][0]=dp[i-1][0][0]+cnt[i][0][0];
dp[i][0][1]=dp[i-1][0][1]+cnt[i][0][1];
pre[i][0][0]=1;
pre[i][0][1]=1;
}
else
{
if(dp[i][j-1][0]>dp[i-1][j][0])
{
dp[i][j][0]=dp[i-1][j][0]+cnt[i][j][0];
pre[i][j][0]=1;
}
else
{
dp[i][j][0]=dp[i][j-1][0]+cnt[i][j][0];
pre[i][j][0]=0;
}
if(dp[i][j-1][1]>dp[i-1][j][1])
{
dp[i][j][1]=dp[i-1][j][1]+cnt[i][j][1];
pre[i][j][1]=1;
}
else
{
dp[i][j][1]=dp[i][j-1][1]+cnt[i][j][1];
pre[i][j][1]=0;
}
}
}
}
if(x!=-1)
{
if(min(dp[n-1][n-1][0],dp[n-1][n-1][1])==0)
{
printf("0\n");
if(dp[n-1][n-1][0]==0)output(n-1,n-1,0);
else output(n-1,n-1,1);
}
else
{
printf("1\n");
for(int i=0;i<n-1;i++)
{
if(i==x)
{
for(int j=0;j<n-1;j++)
{
printf("R");
}
}
printf("D");
}
}
}
else
{
printf("%d\n",min(dp[n-1][n-1][0],dp[n-1][n-1][1]));
if(dp[n-1][n-1][0]<dp[n-1][n-1][1])
{
output(n-1,n-1,0);
}
else output(n-1,n-1,1);
}
return 0;
}

Codeforces Beta Round #2 B. The least round way的更多相关文章

  1. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

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

  3. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  4. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  5. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  6. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  9. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

  10. Codeforces Beta Round #73 (Div. 2 Only)

    Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...

随机推荐

  1. 小b和矩阵

    2486 小b和矩阵 2 秒 262,144 KB 5 分 1 级题   小b有一个m行n列的矩阵. 她会从(1,1)开始,顺时针螺旋访问该矩阵,每个元素恰好被访问一次. 请你按小b的访问顺序输出每个 ...

  2. ssd遇到的bug

    从训练一开始就loss为0: 最开始以为是在生成train.lmdb前没有对label_map进行修改,发现并不是这个问题 1.训练的命令是:python ./examples/ssd/ssd_pas ...

  3. BZOJ4318: OSU! (概率DP)

    题意:一个串 给出每个字符为1的可能性 否则为0 一段连续的1能获得长度的立方的收益 问总收益的期望 题解:设x_i为到第i位时连续的1的期望长度 由i-1递推来的贡献 如果这一位是0没有贡献 如果是 ...

  4. How To: IDENTIFY THE ASM DEVICE FROM ASMLIB

    使用oracleasm querydisk可以查询到device的major和minor,从而对应. for i in `oracleasm listdisks` do oracleasm query ...

  5. CSS三栏布局的四种方法

    总括: 不管是三栏布局还是两栏布局都是我们在平时项目里经常使用的,也许你不知道什么事三栏布局什么是两栏布局但实际已经在用,或许你知道三栏布局的一种或两种方法,但实际操作中也只会依赖那某一种方法,本文具 ...

  6. LUA-点号和冒号

    由于LUA中是模拟类,没有class, 所以这里是使用.号来访问实例的成员 re.SetActive(re, re.activeSelf == false); 而冒号:  则是种语法糖,省略了上面代码 ...

  7. http2提升效率的几个点

    1.二进制传输,消息的解析效率更高 2.头部数据压缩,传输效率更高 3.多路复用,可以让请求并发执行 4.服务器推送,可以主动推送数据到浏览器 http2加载图片demo:https://http2. ...

  8. LVS-NAT负载均衡PHP应用(Wordpress、Discuz)

    1 实验拓扑 2 需求 RS-01和RS-02对外提供WEB服务. RS-01搭建LAMP,PHP通过http模块方式提供. RS-02搭建LAMP,PHP通过fpm方式提供. RS-01和RS-02 ...

  9. 合并多个MP4文件

    把多个MP4文件连接起来的方法与音频文件不太一样,比较有效的方法是: $ cat mylist.txt file '/path/to/file1' file '/path/to/file2' file ...

  10. PHP 获取LDAP服务器Schema数据

    最近工作中一直在与LDAP打交道,在官方推荐的client-apis里,可以很容易找到每个语言对应的API,进而与LDAP服务器交互.但是在用ApacheDirectoryStudio时,这个软件竟然 ...