首页 > 试题广场 >

获得最多的奖金

[编程题]获得最多的奖金
  • 热度指数:27558 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
小明在越南旅游,参加了当地的娱乐活动。小明运气很好,拿到了大奖, 到了最后的拿奖金环节。小明发现桌子上放着一列红包,每个红包上写着奖金数额。
现在主持人给要求小明在这一列红包之间“切”2刀,将这一列红包“切”成3组,并且第一组的奖金之和等于最后一组奖金和(允许任意一组的红包集合是空)。最终第一组红包的奖金之和就是小明能拿到的总奖金。小明想知道最多能拿到的奖金是多少,你能帮他算算吗。

举例解释:桌子上放了红包  1, 2, 3, 4, 7, 10。小明在“4,7”之间、“7,10” 之间各切一刀,将红包分成3组 [1, 2, 3, 4]   [7]   [10],其中第一组奖金之和=第三组奖金之和=10,所以小明可以拿到10越南盾。

数据范围:红包数量满足 ,红包金额满足

输入描述:
第一行包含一个正整数n,表示有多少个红包。

第二行包含n个正整数d[i],表示每个红包包含的奖金数额。


输出描述:
小明可以拿到的总奖金
示例1

输入

5
1 3 1 1 4

输出

5

说明

[1,3,1]  [ ]   [1,4] ,其中第一组奖金和是5,等于第三组奖金和。所以小明可以拿到5越南盾 
示例2

输入

5
1 3 2 1 4

输出

4

说明

[1,3]   [2,1]  [4],小明可以拿到4越南盾 
示例3

输入

3
4 1 2

输出

0

说明

[ ]  [4, 1, 2] [ ] ,小明没办法,为了保证第一组第三组相等,只能都分成空的。所以小明只能拿到0越南盾。 
a,b = int(input()),list(map(int,input().split()))
p,q,s,t = 0,a - 1,0,0
while p - 1 < q + 1:
    if s < t:
        p,s = p + 1,s + b[p]
    elif s > t:
        q,t = q - 1,t + b[q]
    else:
        p,q,r,s,t = p + 1,q - 1,s,s + b[p],t + b[q]
print(r)

发表于 2020-03-13 15:14:39 回复(0)
n=int(input().strip());
d=list(map(int,input().strip().split()));
i,j=-1,n;
su=0;
ka,kb=0,0
while i<=j:
    if ka==kb:
        su=ka
        i+=1;
        j-=1;
        ka+=d[i];
        kb+=d[j];
    elif ka<kb:
        i+=1;
        ka+=d[i];
    else:
        j-=1;
        kb+=d[j];
    
print(su)
    

发表于 2020-02-17 11:00:08 回复(0)
def divide(list, n):
    res = 0
    if n < 1 or n > 200000:
        res = 0
    elif n == 1:
        res = 0
    else:
        left,right = 0, n - 1
        sum_left = list[left]
        sum_right = list[right]
        while left < right:
            if sum_left < sum_right:
                left += 1
                sum_left += list[left]
            elif sum_left > sum_right:
                right -= 1
                sum_right += list[right]
            else:
                res = sum_left
                left += 1
                right -= 1
                sum_left += list[left]
                sum_right += list[right]
    return res


import sys

m = int(sys.stdin.readline().strip())
data = list(map(int, sys.stdin.readline().split()))
tag = 0

for num in data:
    if num < 1 or num > 1000000000:
        print(0)
        tag = 1
if tag == 0:
    print(divide(data, m))

发表于 2019-10-26 22:42:30 回复(0)
利用双指针从两端向中间推进,注意循环条件为左指针low<=右指针high即可(等于的时候还可以进行一次)
n = int(input())
d = list(map(int,input().split()))
low = 0
high = n-1
s1 = 0
s2 = 0
s = 0
while low <= high:
    if s1 <= s2:
        s1 += d[low]
        low += 1
    else:
        s2 += d[high]
        high -= 1
    if s1 == s2:
        s = s1
print(s)

编辑于 2019-08-26 16:06:49 回复(0)
import sys
n=int(sys.stdin.readline().strip())
arr=list(map(int,sys.stdin.readline().split()))
left,right=0,n-1
lsum,rsum=arr[0],arr[-1]
res=0
while left<right:
    if lsum<rsum:
        left+=1
        lsum+=arr[left]
    if lsum>rsum:
        right-=1
        rsum+=arr[right]
    if lsum==rsum:
        res=lsum
        left+=1
        right-=1
        lsum+=arr[left]
        rsum+=arr[right]
print(res)

发表于 2019-08-19 16:00:57 回复(2)
"""
i从前往后求和,j从后往前求和,
当求和相等更新ans,并继续遍历
更新求和小的一侧,直到i>=j停止
ans即为所求
"""
import sys

if __name__ == "__main__":
    # sys.stdin = open('input.txt', 'r')
    n = int(input().strip())
    d = list(map(int, input().strip().split()))
    ans = 0
    i, j, sum_i, sum_j = -1, n, 0, 0
    while i < j:
        if sum_i == sum_j:
            ans = sum_i
            i += 1
            j -= 1
            sum_i += d[i]
            sum_j += d[j]
        elif sum_i > sum_j:
            j -= 1
            sum_j += d[j]
        else:
            i += 1
            sum_i += d[i]
    print(ans)

发表于 2019-07-03 20:33:07 回复(1)