zoukankan      html  css  js  c++  java
  • [Offer收割]编程练习赛50

    题目3 : 末尾有最多0的乘积

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定N个正整数A1, A2, ... AN。  

    小Hi希望你能从中选出M个整数,使得它们的乘积末尾有最多的0。

    输入

    第一行包含两个个整数N和M。  

    第二行包含N个整数A1, A2, ... AN。  

    对于30%的数据,1 ≤ M ≤ N ≤ 12  

    对于100%的数据,1 ≤ M ≤ N ≤ 100  1 ≤ Ai ≤ 1000000000

    输出

    末尾最多的0的个数

    样例输入
    4 2  
    8 25 30 40
    样例输出
    3

    这个组成0就是2 5的个数,找到5的最大值,去枚举2,或者找5去枚举2都可以的吧

    dp[i][j][k]表示第i个数选j个数选k个5的个数的0的个数

    #include<bits/stdc++.h>
    using namespace std;
    int dp[2][105][2005];
    int la(int x,int p)
    {
        int t=0;
        while(x%p==0) x/=p,t++;
        return t;
    }
    int main()
    {
        int n,k;
        cin>>n>>k;
        memset(dp,-1,sizeof(dp));
        dp[0][0][0]=0;
        int cur=0,sum=0,ans=0;
        for(int i=1,x; i<=n; ++i)
        {
            cin>>x;
            int five=la(x,5),two=la(x,2);
            sum+=five,cur^=1;
            for(int j=0; j<=i&&j<=k; ++j)
            {
                for(int k=0; k<=sum; ++k)
                {
                    dp[cur][j][k]=max(dp[cur][j][k],dp[cur^1][j][k]);
                    if(j>=1&&k-five>=0&&dp[cur^1][j-1][k-five]>=0)
                        dp[cur][j][k]=max(dp[cur][j][k],dp[cur^1][j-1][k-five]+two);
                }
            }
        }
        for(int i=0; i<=sum; i++)
            ans=max(ans,min(i,dp[cur][k][i]));
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    记事本开发者日记~二
    《梦断代码》读后感①
    记事本开发日记~一
    仓库管理msi系统
    java web + mysql 的增删改查
    第九周动手动脑
    四则运算答题版
    JAVA常用的异常处理情况
    继承和多态中动手动脑
    laravel1
  • 原文地址:https://www.cnblogs.com/BobHuang/p/8588063.html
Copyright © 2011-2022 走看看