首页 > 其他分享 >CF1646B 题解

CF1646B 题解

时间:2022-08-25 00:45:15浏览次数:85  
标签:return CF1646B int 题解 元素 sumR long sumL

题目传送门

\(\color{red}{see}\space \color{green}{in}\space \color{blue}{my}\space \color{purple}{blog}\)

看到题解里没有用双指针往中间靠的写法的,果断来一发。

思路上是贪心,贪心原则如下。

  • 任何时候保证蓝色元素比红色元素数量多。

  • 每次给剩余的最小元素涂蓝色,给最大元素涂红色。

  • 如果此时红元素的和大于蓝元素的和,说明可以成立。

  • 如果所有元素都被涂上色了,但还没有成立,说明无法构造。

有了这个思路就很容易了,我们先给数据排序

sort(a+1, a+n+1);

然后创建双指针,注意和需要使用 long long

int L = 1; long long sumL = a[1];    //左指针初始化,对应蓝色。 
int R = n+1; long long sumR = 0;     //右指针初始化,对应红色。

接下来两个指针不断朝中靠拢即可。

while (L < R) //注意此处是小于不是小于等于。
{
	if (sumR > sumL) return true;
	sumL += a[++L];   //等价于 L++, sumL += a[L];
	sumR += a[--R];   //等价于 R++, sumR += a[R];
}
return false; 

把几段代码整理一下即可。

完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
int a[200005];
bool solve()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	sort(a+1, a+n+1);
	int L = 1; LL sumL = a[1];  //左指针初始化,对应蓝色。 
	int R = n+1; LL sumR = 0;     //右指针初始化,对应红色。
	while (L < R) //注意此处是小于不是小于等于。
	{
		if (sumR > sumL) return true;
		sumL += a[++L];
		sumR += a[--R];
	}
	return false; 
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		if (solve()) puts("YES");
		else puts("NO");
	}
	return 0;
}

首发:2022-04-13 09:56:57

标签:return,CF1646B,int,题解,元素,sumR,long,sumL
From: https://www.cnblogs.com/liangbowen/p/16622832.html

相关文章

  • CF1624C 题解
    题目传送门\(\color{red}{see}\space\color{green}{in}\space\color{blue}{my}\space\color{purple}{blog}\)小学生又双叒叕来写题解啦!这题还是很简单的,甚至不需要像......
  • CF1617B 题解
    题目传送门\(\color{red}{see}\space\color{green}{in}\space\color{blue}{my}\space\color{purple}{blog}\)小学生又双叒叕来写题解啦!其他题解的代码都是\(O(1)\)......
  • CF402A 题解
    题目传送门\(\color{red}{see}\space\color{blue}{in}\space\color{green}{my}\space\color{purple}{blog}\)小学生又双叒叕来写题解啦!看到其他题解描述得并不清晰,我......
  • AT4894 题解
    题目传送门小学生又双叒叕来写题解啦!翻了一下大家的思路,都用了数组,其实根本不用,可以一边读入一边判断。由于只需考虑前后两个数,所以只用两个变量就能实现滚动数组。若......
  • AT4783 题解
    题目传送门小学生又双叒叕来写题解啦!这题的关键就是贪心。看到N的范围,瞬间明白可能要排序。所以我们靠着排序来想。我们来思考一下怎样安排顺序。对于两个时间限......
  • AT4891 题解
    题目传送门小学生又双叒叕来写题解啦!这题的翻译貌似不完整。所谓怪兽与英雄的对决,就是双方同时扣同样的血,直到一方为零。弄懂题后,你会发现,这题不是考贪心,而是模拟。写......
  • AT4573 题解
    题目传送门小学生又双叒叕来写题解啦!我来介绍一种与众不同的跑得更慢的方法,那就是排序加二分。排序的作用是为了二分,因为二分的前提是数组有序。因此读入完数据后排序......
  • AT2141 题解
    题目传送门小学生又双叒叕来写题解啦!出布永远不会亏,所以只要能出布就出布。这就变成了个模拟题。需要记录石头的数量、布的数量、总分。送上满分代码:#include<iostr......
  • AT3524 题解
    题目传送门小学生又双叒叕来写题解啦!每个数都不受限制的可以变成三个数,那我们就用数组存每个数的变身情况,每次都给那三个数对应的计数器加一即可。然后呢?大家的思路都......
  • AT2162 题解
    题目传送门这题可以线性效率过,有位大神用哈希表虐橙题,太恶心厉害了,然而根本不需要。我使用双指针做这题,同样是线性效率!两个指针都是从零开始,分别指向两个字符串。每一......