当前位置: 首页 > 后端技术 > Python

AtCoderContextABC167-C-SkillUp

时间:2023-03-26 19:04:16 Python

RunningRequirementsRuntimeLimit:2secMemoryLimit:1024MB原题链接标题刚开始代码竞赛的小明有M个算法想学。一开始,小明对每个算法的理解都是0。小明去书店,买了N本参考书。第i本参考书(1<=i<=N)的售价为Ci元。如果买了第i本参考书,小明对第j(1<=j<=M)算法的理解就会增加A(i,j)。除此之外,没有别的办法可以帮助小明提高对算法的理解。小明的目标是将自己对M算法的理解提高到X以上。判断小明是否可以通过购买参考书来达到目标??,如果可以达到目标,求出达到目标需要购买参考书的最低金额。输入先决条件所有输入都是整数1<=N,M<=121<=X<=10^51<=Ci<=10^50<=A(i,j)<=10^5输入NMXC1A(1,1)A(1,2)?A(1,M)C2A(2,1)A(2,2)?A(2,M)?CNA(N,1)A(N,2)?A(N,M)如果小明无法通过购买参考书达到目标,则输出-1如果通过购买参考书可以达到目标,则输出最少需要的数量。例1输入3310602247087950239输出120购买第二、第三本参考书,总调用费120元,可以将所有算法的理解提高到10以上。这是需要花费的最低金额。例2输入3310100314100159100265输出-1即使你买了所有的参考书,你仍然无法将第一个算法的理解提高到10以上。例3输入85221003753116445278334727292344728254154336235486973943616287284372output1067readable这个题目可以抽象成下面这个题目定义N、M、X和纬度为(N,M)的数组。可以从里面跳出几行数组元素,选中的行数组的列方向之和要大于X有12本书,有买和不买两种状态,所以状态这本书最多只能有2^12=4096个状态。每本书有M个算法,1<=M<=12,也就是说每本书最多需要遍历12个算法,总共需要遍历4096*12=49152次。那么我们就可以通过位运算来遍历所有的图书购买,然后筛选出符合条件的图书购买。最后从满足条件代码N,M,X=map(int,input().split())ARR=[]foriinrange(N):ARR.append(list(map(int,input().split())))defcalculate(n,m,x,arr):结果=[]foriinrange(2**n):tmpValue=0mrr=[0]*mkrr=[False]*mforjinrange(n):res=i>>j&1ifres==1:tmpValue=tmpValue+arr[j][0]formIndexinrange(m):mrr[mIndex]=mrr[mIndex]+arr[j][mIndex+1]如果mrr[mIndex]>=x:krr[mIndex]=True如果sum(krr)==m:result.append(tmpValue)如果len(result)==0:打印(-1)否则:打印(最小(结果))计算(N,M,X,ARR)总结说这道题考察的是对位运算的敏感性。通过阅读题中给出的条件,我们可以判断遍历所有情况的可行性,所以我们选择使用位操作来遍历所有※ 另外,我会在我的微信个人订阅号推出一些文章,欢迎大家注意