Educational Codeforces Round 26 D

xiaoxiao2021-02-27  190

显然这是个dp 考虑状态只有因子5的个数和因子2的个数 而1e18不会超过26个因子5 所以用dp[i][j][k]来表示到第i个数已经选了j个有因子5k个时因子2的个数 而这样的三维数组会爆空间 所以滚动dp降低一维

用dp[][][]用来表示某种状态是否存在的时候是会有点浪费的 可以把某一位拆出去

#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> #include <ctime> using namespace std; #define pb push_back #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d%d",&n,&m) #define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define sld(n) scanf("%lld",&n) #define sldd(n,m) scanf("%lld%lld",&n,&m) #define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define sf(n) scanf("%lf",&n) #define sff(n,m) scanf("%lf%lf",&n,&m) #define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define ss(str) scanf("%s",str) #define ans() printf("%d",ans) #define ansn() printf("%d\n",ans) #define anss() printf("%d ",ans) #define lans() printf("%lld",ans) #define lanss() printf("%lld ",ans) #define lansn() printf("%lld\n",ans) #define r0(i,n) for(int i=0;i<(n);++i) #define r1(i,e) for(int i=1;i<=e;++i) #define rn(i,e) for(int i=e;i>=1;--i) #define rsz(i,v) for(int i=0;i<(int)v.size();++i) #define szz(x) ((int)x.size()) #define ms(abc,bca) memset(abc,bca,sizeof abc) #define lowbit(a) (a&(-a)) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define pli pair<ll,int> #define mp make_pair #define lrt rt<<1 #define rrt rt<<1|1 #define X first #define Y second #define PI (acos(-1.0)) typedef long long ll; typedef unsigned long long ull; const ll mod = 1000000000+7; const double eps=1e-7; const int inf=0x3f3f3f3f; const ll infl = 1e16; const int maxn= 200+10; const int maxm = 1000000+10; int t[maxn],f[maxn]; int dp[205][5500]; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL int n,k; sdd(n,k); int tot =0; for(int i=1; i<=n; ++i) { ll x; sld(x); int tt = 0 , ff =0 ; while(x%2==0)tt++,x/=2; while(x%5==0)ff++,x/=5; t[i] = tt, f[i] =ff; tot+=ff; } ms(dp,-1); int ans =0 ; dp[0][0]=0; for(int i=1; i<=n; ++i) for(int j=k; j; --j) { for(int l = tot; l>=f[i]; --l) { if(dp[j-1][l-f[i]]!=-1) dp[j][l] = max(dp[j][l],dp[j-1][l-f[i]]+t[i]); } } for(int i=1; i<=tot; ++i) ans = max(ans , min( dp[k][i] ,i ) ); ansn(); return 0; }
转载请注明原文地址: https://www.6miu.com/read-13651.html

最新回复(0)