Three Bags(思维)

本文介绍了一种解决背包问题的方法,通过合理利用不同背包间的数来最大化最终剩余的单一数值。策略包括利用最小数做负贡献,以及通过组合背包以实现最大正效应。代码展示了如何实现这一算法,以求解当三个背包只剩下一个数时的最大值。
摘要由CSDN通过智能技术生成

题目
题意:给定3个背包,每个背包放置若干个数(同一书包可能放重复的数,都是正数)。现在重复若干次以下操作:分别从两个背包拿出数a和b,将b从原来的背包中消除,将a变为a-b并替换a放回原书包。现在要使3个背包最终只剩下一个数,使得这个数最大,求该值。
题解:要使数最大,那么这些背包的数尽量做正贡献,但总得有些数做负贡献。首先,我们可以想到,选取最小的数做减数最优。做一些简单的样例,找一些规律。
1、同一个背包的数可以依托于另一个背包的一个数,使得同一个背包的数都做相同的正/负贡献。如{1,2,3,4}{5},可以{1,2,3,4}{5}->{1}{5-2-3-4}->{1+2+3+4-5}{},或者{1,2,3,4}{5}->{}{5-1-2-3-4}。
2、一个背包可以依托另一个背包的数(该数也做负贡献),只牺牲一个数,即该背包一个数做负贡献,一个数做正贡献。如{1,2,3}{4,5,6}{7}->{1-5-6}{4-2-3}{7}->{}{}{7-1+5+6-4+2+3}
结合上述规律,我们总结取最优值的两种情况:1、选取两个背包的各自最小值做负贡献,其余值做正贡献;2、选取一个总和最小的背包做负贡献,其余数做正贡献。
代码如下

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 300010;


int n[3];
int a[3][maxn];
int mn[3];
ll sum[3], mns;

int main() {
	
	for (int i = 0; i < 3; ++i)
		scanf("%d", &n[i]);
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < n[i]; ++j) {
			scanf("%d", &a[i][j]);
		}
	}
	for (int i = 0; i < 3; ++i) {
		mn[i] = a[i][0];
		sum[i] = a[i][0];
		for (int j = 1; j < n[i]; ++j) {
			mn[i] = min(mn[i], a[i][j]);
			sum[i] += a[i][j];
		}
	}
	ll all = 0;
	for (int i = 0; i < 3; ++i)
		all += sum[i];
	ll ans = all - 2 * min(sum[0], min(sum[1], sum[2]));
	ll mn2 = mn[0] + mn[1] + mn[2] - max(mn[0], max(mn[1], mn[2]));
	ans = max(ans, all - 2 * mn2);
	
	printf("%lld\n", ans);
	
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: three.js 是一个 JavaScript 库,用于在浏览器中创建和渲染 3D 图形。下面是 three.js 的一个简单思维导图: - Scene:场景,用于放置和组织 3D 对象的场所 - Camera:相机,用于捕捉场景的图像 - Renderer:渲染器,用于将场景的图像渲染到浏览器的 Canvas 中 - Geometry:几何体,用于描述 3D 对象的形状 - Material:材质,用于描述 3D 对象的外观 - Mesh:网格,由几何体和材质组成,是可以放入场景的 3D 对象 这些部分相互协作,在浏览器中创建和渲染 3D 图形。 ### 回答2: three.js 是一个用于创建网页3D图形的JavaScript库。它提供了一个简单、灵活且强大的工具集,使开发人员能够在网页上创建出令人惊叹的3D视觉效果。 three.js 的思维导图可以从三个主要部分来详细解释。首先是场景(Scene),它代表了整个3D世界的环境。在场景中,我们可以添加各种对象,如几何体(Geometry)和材质(Material)。 几何体是指3D物体的形状,比如盒子、球、圆锥等等。通过定义不同的顶点坐标和面,我们可以创建出各种各样的几何体。而材质则定义了几何体的外观特征,如颜色、纹理、透明度等。three.js 提供了多种内置的材质类型,也支持自定义材质的创建和使用。 除了场景、几何体和材质,three.js 还提供了相机(Camera)和渲染器(Renderer)这两个关键要素。相机用于定义我们从什么角度和距离观察场景,它可以控制视角、缩放比例等参数。渲染器则负责将场景中的3D对象渲染到屏幕上,让用户能够看到呈现出来的图像。 在three.js的思维导图中,这些关键要素之间相互连接,形成了一个完整的3D图形渲染流程。我们可以通过添加光源(Light)来改变场景中的光照效果,通过添加控制器(Controller)来实现交互操作,比如旋转、缩放、平移场景中的对象。 总的来说,three.js 的思维导图可以让我们清晰地了解到它的组成结构以及和其他元素之间的交互关系。这个思维导图可以帮助开发人员更好地理解和使用three.js,并且能够更快地构建出惊艳的3D网页图形。 ### 回答3: three.js是一个用于在浏览器中创建和展示交互式3D图形的JavaScript库。它提供了一个简单易用的API,允许开发者通过编写少量的代码来创建各种各样的3D效果和动画。下面是three.js的思维导图。 1. 安装与设置:首先,我们需要将three.js库引入到我们的项目中。可以通过下载源代码或使用CDN的方式来获取库文件。然后我们需要设置一个场景(scene)、摄像机(camera)和渲染器(renderer),这些是使用three.js的基本要素。 2. 创建对象:使用three.js,我们可以创建各种3D对象,如立方体、球体、平面等。通过提供对象的几何形状(geometry)和材质(material),我们可以在场景中显示这些对象。 3. 光照与材质:光照是创建逼真3D效果的重要组成部分。在three.js中,我们可以添加不同类型的光源来照亮场景。材质则定义了对象的外观和如何对光源的响应。通过设置材质的属性,如颜色、纹理、透明度等,我们可以实现各种视觉效果。 4. 动画与交互:three.js提供了动画库,可以让我们创建各种动画效果,如旋转、缩放和平移等。我们可以使用插值器(interpolators)来定义物体的运动路径,并使用时间函数(easing functions)来控制动画的速度和效果。除了动画外,我们还可以通过监听鼠标、键盘和触摸事件来实现与用户的交互。 5. 导入与导出:three.js支持导入与导出3D模型文件,如OBJ、GLTF等。这使得我们可以在three.js中使用外部创建的模型,进一步扩展我们的3D场景。 总结:通过以上几个主要的步骤,我们可以使用three.js库创建交互式的3D场景。从设置场景、摄像机和渲染器,到创建对象、添加光照和材质,再到实现动画和交互,我们可以利用three.js的强大功能和易用性,为我们的项目带来令人惊叹的3D体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值