CF1285B Just Eat It!

CF1285B Just Eat It!

题目链接:CF1285B
题意:给你含有n个数的序列。要判断序列总和是否严格大于任意子序列(子序列即为[l,r]!=[1,n])之和,如果是则输出“YES",否则输出”NO“。例如序列[1,-1,1,1]总和为2,其中子序列[1,1]和为2。而2不大于2。所以输出”NO"。如果序列为[1,1,1,1],总和为4,而在这个序列中找不出任意一个子序列和大于等于4的,所以输出“YES”。

思路:这题其实就是最大连续子序列和的应用。只不过要记录子序列的长度。因为如果当最长子序列的和与序列的总和相等时要判断该子序列长度是否为n。因为子序列不能与原序列相等。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int tmp = 0;
int cur = 0;//最大子序列和的长度
long long maxSubArray(vector<long long> A, int n)
{
	if (n == 0)return 0;
	cur = 1;
	tmp = 1;
	long long sum = A[0], maxsum = A[0];
	for (int i = 1; i < n; i++)
	{
		if (sum > 0)   //这里不能写sum>=0,不然像[1,-1,1,1]这种样例过不去
		{
			sum += A[i];
			tmp++;
		}
		else
		{
			sum = A[i];
 
			tmp = 1;
		}
		if (sum > maxsum) {
			maxsum = sum;
			cur = tmp;
		}
	}
	return maxsum;
}
 
 
 
int main() {
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		long long sum = 0;
		vector<long long> v(n + 1);
		int i;
		for (i = 0; i < n; i++) {
			cin >> v[i];
			sum += v[i];
		}
		long long maxNum = 0;		
		maxNum = maxSubArray(v, n);
		if (sum > maxNum || (sum == maxNum && cur == n))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}
发布了50 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43058685/article/details/103933822
今日推荐