首页 > 其他分享 >D. Round Subset

D. Round Subset

时间:2024-07-17 18:21:03浏览次数:11  
标签:Subset int while -- cnt5 cnt2 Round dp

原题链接

题意

选择 \(k\) 个数,使得 \(\min(\sum 2,\sum 5)\) 最大

实施

1.二维背包dp,使因数 5 和 2 达到某一值的最小选择个数,但是因子数量最多有 3600,会T

2.于是试着想能不能交换背包容量与价值?

3.发现 k 最多只有 200,好像可以

细节

最多有 6000 个五大约

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int dp[250][6008]={0};//选i个数,产生j个5因子,能获得最多的2因子个数

void solve()
{
    int n,k;
    cin>>n>>k;
    memset(dp,-1,sizeof dp);
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        ll x;
        cin>>x;
        int cnt2=0,cnt5=0;
        while(x%2==0)
        {
            cnt2++;
            x/=2;
        }
        while(x%5==0)
        {
            cnt5++;
            x/=5;
        }

        for(int j=k;j>=1;j--)
        {
            for(int l=6000;l>=cnt5;l--)
            {
                if(dp[j-1][l-cnt5]!=-1)dp[j][l]=max(dp[j][l],dp[j-1][l-cnt5]+cnt2);
            }
        }
    }

    int ans=0;
    for(int i=1;i<=k;i++)
    {
        for(int j=0;j<=6000;j++)
        {
            if(dp[i][j]==-1) continue;
            ans=max(ans,min(j,dp[i][j]));
        }
    }

    cout<<ans;
}
int main()
{
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

标签:Subset,int,while,--,cnt5,cnt2,Round,dp
From: https://www.cnblogs.com/pure4knowledge/p/18308040

相关文章

  • CodeForces Round 898 (div 4) H题解析
     CodeForcesRound898(div4)H.Mad City                           大致思路   对于有n条边和n个点,说明这个图里面只有一个环并且两人同时开始和结束移动,所以可以得到当Valeriu进入到这个图里面的唯一......
  • Codeforces Round 958 (Div. 2)
    题目链接:CodeforcesRound958(Div.2)总结:C因为常数没转\(longlong\)\(wa\)两发,难绷。A.SplittheMultisetfag:模拟Description:给定一个\(n\)和一个\(k\),每次可以将\(n\)减掉一个数\(u\),然后插入\(x\)个数,\(x<=k\),并且插入的数之和等于\(u\)。求将其转化为全\(1\)的最......
  • Codeforces Round 957 (Div. 3)
    知识点1.几个数相乘时,更小的数增加会比更大的数增加得到的乘积来得大题解A.OnlyPluses1.几个数相乘时,当更小的数增大时,得到的乘积会比更大的数增大来得大,也就是更小的数字权重会比较大,那么在5次+1的过程中,每次找最小值++即可#include<bits/stdc++.h>#defineintlonglon......
  • Codeforces Round 898 (Div. 4)(A~H)
    目录A.ShortSortB.GoodKidC.TargetPracticeD.1DEraserE.BuildinganAquariumF.MoneyTreesG.ABBCorBACBH.MadCityA.ShortSortProblem-A-Codeforces暴力枚举每个位置的交换即可。#include<iostream>#include<algorithm>#include<queue......
  • SMU Summer 2024 Contest Round 4
    AMadeUp思路:统计A的个数,O(1)统计cnt[bc]voidsolve(){intn;cin>>n;vector<int>cnt(n+1),b(n+1);for(inti=1;i<=n;++i){intx;cin>>x;cnt[x]++;}for(inti=1;i<=......
  • Codeforces Round 957 (Div. 3)
    题目链接:CodeforcesRound957(Div.3)总结:E不懂,F差一个set去重A.OnlyPlusesfag:枚举B.AngryMonkfag:模拟Solution:分裂的花费为\(a_i-1\),添加的花费为\(a_i\)。C.GorillaandPermutationfag:思维Solution:大于等于\(k\)的数,逆序放在最前面,小于等于\(m\)的数,从最后面......
  • Codeforces Round 958 (Div. 2)补题
    文章目录A题(拆分多集)B题(获得多数票)C题(固定OR的递增序列)A题(拆分多集) 本题在赛时卡的时间比较久,把这题想复杂了,导致WA了两次。后来看明白之后就是将n每次转换成k-1个1,到最后分不出来k-1个1直接一次就能分完,即结果加一;#include<bits/stdc++.h>#definein......
  • Python教程:ceil、floor、round、int取整
    1.向上取整math.ceilmath.ceil()严格遵循向上取整,所有小数都向着数值更大的方向取整。importmathmath.ceil(-1.5)#-1math.ceil(1.5)#2math.ceil(-0.9)#02.向下取整math.floor同math.ceil类似,方向相反,向下取整。importmathmath.floor(-0.5)#-1math.floor......
  • SMU Summer 2024 Contest Round 4
    SMUSummer2024ContestRound4MadeUp题意给你三个序列\(A,B,C\),问你满足\(A_i=B_{C_j}\)的\((i,j)\)对有多少。思路由于\(1\leA_i,B_i,C_i\leN\),所以可以统计\(Cnt[A_i]\)和\(Cnt[B_{C_i}]\)的个数,两者相乘累加即可。代码#include<bits/stdc++.h>using......
  • 题解:SP11469 SUBSET - Balanced Cow Subsets
    SP11469(折半搜索)题目大意:给出$N$个数,求可以被分成两个和相等的集合的子集数。思路分析:首先考虑朴素的DFS,每个数有三种情况:选为$A$集合,选为$B$集合,两个集合都不选。暴力DFS时间复杂度为$3^{20}$。观察到$N$很小,而$3^{10}$是可以通过本题的,于是考虑折半搜索。我......