CF-Round #613-div2-B题

CF-Round #613-div2-B题

B. Just Eat It!

传送门

想想还是把这道题的博客补上。
这道题是一道贪心

主人公A和主人公B,他们去选吃的。A会选择所有种类。B只会选择区间[L, R]的区间(B不能取到[1,N])。每种食品都会有一个好吃值。
如果B选出来的好吃总值大于等于A,那么A就会不高兴。
问当前序列能不能使得A高兴(B足够聪明做选择使得A不高兴)

这道题就是看看B选到的区间有没有比A大或等于的可能。

本题思路就是看看序列的前缀pre或者是后缀suf有没有小于等于0的可能。
如果有。那么B就可以不选择这一段,选择剩下的一段。这样可以使得B的选择比A大或相等。

简单的贪心问题~

代码部分:

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
 
int n;
ll a[N];
ll suf[N];
ll pre[N];
ll sum;
 
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		cin >> n;
		sum = 0;
		int flag = 0;
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
			sum += a[i];
			if (!i)
			{
				pre[i] = a[i];
			}
			else
			{
				pre[i] = pre[i - 1] + a[i];
			}
			if (pre[i] <= 0)
			{
				flag = 1;
			}
		}
		suf[n - 1] = a[n - 1];
		if (suf[n - 1] <= 0)
		{
			flag = 1;
		}
		for (int i = n - 2; i >= 0; i--)
		{
			suf[i] = suf[i + 1] + a[i];
			if (suf[i] <= 0)
			{
				flag = 1;
			}
		}
		if (flag)
		{
			cout << "NO\n";
		}
		else
		{
			cout << "YES\n";
		}
	}
	return 0;
}
发布了127 篇原创文章 · 获赞 3 · 访问量 3219

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/105228592