[Daimayuan] 吃糖果(C++,贪心)

这篇具有很好参考价值的文章主要介绍了[Daimayuan] 吃糖果(C++,贪心)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

桌子上从左到右放着 n n n 个糖果。糖果从左到右编号,第 i i i 块糖果的重量为 w i w_i wi。小明和小红要吃糖果。

小明从左边开始吃任意数量的糖果。(连续吃,不能跳过糖果)

小红从右边开始吃任意数量的糖果。(连续吃,不能跳过糖果)

当然,如果小明吃了某个糖果,小红就不能吃它(反之亦然)。

他们的目标是吃同样重量的糖果,请问此时他们总共最多能吃多少个糖果?

输入格式

第一行包含一个整数 n n n,表示桌上糖果的数量。

第二行包含 n n n 个整数 w 1 , w 2 , … , w n w_1,w_2,…,w_n w1,w2,,wn,表示糖果从左到右的重量。

输出格式

一个整数,表示小明和小红在满足条件的情况下总共可以吃的糖果的最大数量。

数据范围

1 ≤ n ≤ 2 ∗ 1 0 5 , 1 ≤ w i ≤ 1 0 4 1≤n≤2*10^5,1≤w_i≤10^4 1n2105,1wi104

输入样例
9
7 3 20 5 15 1 11 8 10
输出样例
7
解题思路

采用贪心算法(不断尝试吃更多的糖)解决此题:

初始化规定糖的重量相等,然后循环分支:

(1)糖的重量相等,记录当前总共吃了多少颗糖,双方再吃一颗糖;

(2)糖的重量不相等,吃的少的一方再吃一颗糖。

结束条件:双方吃糖发生冲突(题目规定:“如果小明吃了某个糖果,小红就不能吃它(反之亦然)”)。

AC代码如下:

#include <iostream>
using namespace std;
const int max_n = 2e5;
const int max_w = 1e4;

int candies[max_n];

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> candies[i];

	int l = 0, r = n - 1, l_sum = 0, r_sum = 0, ans = 0;
	while (l < r) {
		if (l_sum == r_sum) {
			ans = l - 0 + n - 1 - r;
			l_sum += candies[l++];
			r_sum += candies[r--];
		}
		else if (l_sum < r_sum) l_sum += candies[l++];
		else r_sum += candies[r--];
	}
	cout << ans << endl;
	return 0;
}

贪心证明:

初始化,规定双方吃糖量相同,吃糖数目为 0 0 0

为了确定是否存在比 0 0 0大的解,我们必须要让其中一方吃一颗糖。

那么这就会导致双方吃糖量不等,要让其相等,我们必须让另一方吃一颗糖。

只要不平衡,我们就需要让吃的少的那一方继续吃。

当平衡的时候,设吃糖数目为 a n s ans ans

为了确定是否存在比 a n s ans ans大的解,我们必须要让其中一方吃一颗糖…(依次类推,直到发生冲突)文章来源地址https://www.toymoban.com/news/detail-431271.html

到了这里,关于[Daimayuan] 吃糖果(C++,贪心)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode-135】分发糖果(贪心)

    LeetCode135.分发糖果 题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻的孩子中,评分高的孩子必须获得更多的糖果。

    2024年01月24日
    浏览(35)
  • 算法 贪心3 || 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

    思路: 给数组按照绝对值大小排序 ,优先将负数转成正数。如果此时 k % 2 == 1 。最后再将 绝对值最小的值变成负数 (该值可能原本是负数) 而不是直接从小到大排序。 例如-8,-5,-5,-3,-2,9这种序列。如果直接从小到大排序,那么最后一个变符号的就会是9,但其实让

    2023年04月12日
    浏览(36)
  • [Daimayuan] 碰撞2(C++,模拟)

    在 x O y xOy x O y 坐标系中有 N N N 个人,第 i i i 个人的位置是 ( X i , Y i ) (X_i,Y_i) ( X i ​ , Y i ​ ) ,并且每个人的位置都不同。 我们有一个由 L 和 R 组成的长为 N N N 的字符串 S S S , S i = S_i= S i ​ = R 代表第 i i i 个人面向右, S i = S_i= S i ​ = L 代表第 i i i 个人面向左。 现在所

    2023年04月09日
    浏览(33)
  • [Daimayuan] 添加括号(C++,数学)

    现在给出一个表达式,形如 a 1 / a 2 / a 3 / . . . / a n a_1/a_2/a_3/.../a_n a 1 ​ / a 2 ​ / a 3 ​ /.../ a n ​ 。 如果直接计算,就是一个个除过去,比如 1 / 2 / 1 / 4 = 1 / 8 1/2/1/4=1/8 1/2/1/4 = 1/8 。 然而小 A A A 看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行

    2024年02月05日
    浏览(32)
  • 【贪心算法Part03】| 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

    目录 🎈LeetCode1005.K次取反后最大化的数组和  🎈LeetCode134.加油站 🎈LeetCode135.分发糖果 链接:1005.K次取反后最大化的数组和 给你一个整数数组  nums  和一个整数  k  ,按以下方法修改该数组: 选择某个下标  i  并将  nums[i]  替换为  -nums[i]  。 重复这个过程恰好  k  次

    2024年02月16日
    浏览(42)
  • [Daimayuan]新国王游戏(C++,数学)

    又到了 H H H 国国庆, 国王再次邀请 n n n 位大臣来玩有奖游戏。上次国庆被众臣吐槽国王小气后,国王决定今年大方点,改变游戏规则且不再参与游戏,免得被大臣们质疑。首先, 他让每位大臣在左、 右手上面分别写下一个正整数。然后让这 n n n 位大臣排成一排。排好队后,

    2023年04月08日
    浏览(34)
  • [Daimayuan] 异或和(C++,异或,数学)

    给定一个长度为 n n n 的数组 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a 1 ​ , a 2 ​ , ... , a n ​ 。 请你求出下面式子的模 1 e 9 + 7 1e9+7 1 e 9 + 7 的值。 ∑ i = 1 n − 1 ∑ j = i + 1 n ( a i   X O R   a j ) sum_{i=1}^{n-1}{sum_{j=i+1}^{n}{(a_i XOR a_j)}} ∑ i = 1 n − 1 ​ ∑ j = i + 1 n ​ ( a i ​   XOR   a j ​

    2024年02月01日
    浏览(41)
  • 力扣算法刷题Day34|贪心:K次取反后最大化的数组和 加油站 分发糖果

    力扣题目:# 1005.K次取反后最大化的数组和  刷题时长:10min 解题方法:贪心 复杂度分析 时间O(n) 空间O(1) 问题总结 无 本题收获 贪心思路:两次贪心 在包含正负无序的整数数组中,如何转变K次正负,让数组和达到最大 局部最优:让绝对值大的负数变为正数,当前数值达到

    2024年02月09日
    浏览(51)
  • LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)

    参考前文 参考文章: LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和) LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II) LeetCode链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ 首先 sor

    2024年02月09日
    浏览(42)
  • Day34 贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

    思路 第一步,从前向后遍历,遇到负数将其变为正数,同时K– 第二步:如果K还大于0,那么反复转变数值最小的元素,将K用完 第三步:求和 方法一(暴力) leetcode超时(35/40) 方法二(贪心)

    2024年01月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包