n = int(input()) m = int(input()) a = list(map(int,input().split())) b = list(map(int,input().split())) newl = [] prem = [] #维护前m项ai-m*bi最小值 for i in range(len(a)): newl.append((a[i],b[i])) newl = sorted(newl,key=lambda x:(x[1],x[0]),reverse=True) for i in range(m): prem.append([newl[i][0]-i*newl[i][1],i]) for i in range(m,n): minmum = min(prem) index = prem.index(minmum) if newl[i][0]-(m-1)*newl[i][1]>minmum[0]: del prem[index] for ind in range(index,m-1): prem[ind][0] += newl[prem[ind][1]][1] prem.append([newl[i][0]-(m-1)*newl[i][1],i]) else:continue print(sum([i[0] for i in prem])) 这么做不知道对不对。。考试的时候没写完,全当抛砖引玉吧。。。。
楼主咱俩一套卷纸,第一题没交上求大家帮我看看思路对不对.... 我的思路是最后a肯定要拿完,所以答案一定是sum(a)-(所有减的数的和) 然后既然最大和,肯定要减越少越好,每次数相减都要减去len(当前a)-1个b中的数,要让这些减数的和最小,每次都找b中最小的len(当前a)-1个数去减对应ai,因此给b排序,每次pop出b最大的数使剩下的是b中最小的len(当前a)-1个数,然后这一轮减数的和就是sum(b),更新减数总值sub+=sum(b)直到取到最后一个a中的数,最后用sum(a)-sub即可。。。。 na = 5 nb = 5 a = [10,20,30,40,50] b = [4,5,6,7,8] b_sort = sorted(b) sub = 0 for i in range(na-1): b_sort.pop() sub += sum(b_sort) res = sum(a)-sub print(res)