2020牛客暑期多校训练营(第八场)K.Kabaleo Lite(前缀和,高精)

题目传送
题意:
有n道菜,第i道菜有bi盘,每盘利润为ai(利润可能为负)。遵循以下规则为每个顾客上菜:
● 每位顾客至少有一道菜。
● 每位顾客都得到从1开始的连续编号的菜,每道菜只吃一盘。
问能容纳的最大的顾客数,已经可赚取的最大利润。

思路:
首先,最多的人数肯定是第一道菜的人数。
其次,要最大利益,那么我们前缀和,贪心先拿最大的利益,依次下去(我不知道暴力会不会t),但是这个东西爆了long long,只有用__int128过,但是奈何cb不支持这个东西,我又不会Dev,就只能用py了。。

这里讲讲如何优化上面的暴力找前缀和最大值。
其实我们这样想:不管你最大利润在哪,我都要拿第一道菜,所以我们直接先把第一道菜拿完,然后,继续,如果后的前缀比前面的大,那么对答案有帮助,加上有帮助的那一增值

借鉴了一下大佬的代码

AC代码

t = int(input())
for i in range(t):
    n = int(input())
    lista = list(map(int,input().split()))
    listb = list(map(int,input().split()))
    sum = lista[0]*listb[0]
    Min = listb[0]
    ans = Minans = lista[0]
    for j in range(1,n):
        Min = min(Min,listb[j])
        ans += lista[j]
        if(ans > Minans):
            sum += (ans-Minans)*Min
            Minans = ans
    print("Case #{}: {} {}".format(i+1,listb[0],sum))

你可能感兴趣的:(牛客,思维)