列表

详情


NC14719. ZZZZone爱吃糖

描述

ZZZZone是一个特别喜欢甜食的人。有一天,他得到了n个糖果盒子,每个盒子里都有无穷个糖果,每个盒子里的糖果都有固定的甜蜜值。
为了获得更多的甜蜜值,ZZZZone列出了m个方案:每个方案中都有一个L 、R,ZZZZone会从第L个盒子到第R个盒子这连续的R - L + 1 个盒子中,每个盒子里拿出一颗糖吃掉,来获得甜蜜值。
每个方案最多只能实现一次,当然也可以不实现,那么,ZZZZone可以获得的最大甜蜜值是多少?


输入描述

第一行,一个整数n,表示有n个糖果盒子 (n <= 10000)
第二行包含n个整数,表示从下标为1到n的盒子的甜蜜值(-10000 <= wi <= 10000)
第三行包含一个整数m表示方案数 (m <= 10000)
接下来m行,每行两个整数L, R (1 <= L, R <= n)

输出描述

输出一行,包含一个整数表示最大的甜蜜值.

示例1

输入:

5
1 -2 3 -4 5
2
1 5
1 2

输出:

3

说明:

第一个方案从1到5可得到3的甜蜜值,第二个可以得到-1的甜蜜值(此时当然不会选这个方案),所以最大可得到3的甜蜜值

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 255ms, 内存消耗: 27996K, 提交时间: 2021-12-03 19:49:42

n = int(input())

a = list(map(int, input().split()))
pre = [0 for i in range(0, n + 2)]

for i in range(1, n + 1) :
    pre[i] = pre[i - 1] + a[i - 1]
m = int(input())
ans = 0
while m > 0 :
    m -= 1
    l, r = map(int, input().split())
    if pre[r] - pre[l - 1] >= 0 :
        ans += pre[r] - pre[l - 1]
print(ans)

C 解法, 执行用时: 12ms, 内存消耗: 372K, 提交时间: 2022-02-17 12:49:11

#include<stdio.h>
int main()
{
	int m,n,i,l,r,k;
    long int x=0;
	scanf("%d",&n);
    int a[n];
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	scanf("%d",&m);
	while(m--)
	{
		k=0;
		scanf("%d %d",&l,&r);
		for(i=l-1;i<r;i++)
		{
			k=k+a[i];
		}
		if(k>0)
		{
			x=x+k;
		}
	}
	printf("%ld\n",x);
	return 0;
 } 

C++11(clang++ 3.9) 解法, 执行用时: 39ms, 内存消耗: 384K, 提交时间: 2017-12-30 14:57:24

#include<iostream>
using namespace std;

int main()
{
	int a[10001]={0},l,r,n,m;
	long long int s,max=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	cin>>m;
	for(int k=0;k<m;k++)
	{
		cin>>l>>r;s=0;
		for(int i=l;i<=r;i++)
		s+=a[i];
		if(s>0)
		max+=s;
	}
	cout<<max<<endl;
	return 0;
}

上一题