天平

FJ有一架用来称牛的体重的天平。与之配套的是N(1<=N<=40)个已知质量的砝码(所有砝码质量的数值都在31位二进制内)。每次称牛时,他都把某头奶牛安置在天平的某一边,然后往天平另一边加砝码,直到天平平衡,于是此时砝码的总质量就是牛的质量(FJ不能把砝码放到奶牛的那边,因为奶牛不喜欢称体重,每当FJ把砝码放到她的蹄子底下,她就会尝试把砝码踢到FJ脸上)。天平能承受的物体的质量不是无限的,当天平某一边物体的质量大于C(1<=C<2^30)时,天平就会被损坏。
砝码按照它们质量的大小被排成一行。并且,这一行中从第3个砝码开始,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和。
FJ想知道,用他所拥有的这些砝码以及这架天平,能称出的质量最大是多少。由于天平的最大承重能力为C,他不能把所有砝码都放到天平上。
现在FJ告诉你每个砝码的质量,以及天平能承受的最大质量。你的任务是选出一些砝码,使它们的质量和在不压坏天平的前提下是所有组合中最大的。

Input
第1行: 两个用空格隔开的正整数,N和C。
第2…N+1行: 每一行仅包含一个正整数,即某个砝码的质量。保证这些砝码的质量是一个不下降序列。

Output
第1行: 一个正整数,表示用所给的砝码能称出的不压坏天平的最大质量。

Sample Input
3 15
1
10
20

Sample Output
11

Data Constraint

Hint
【样例说明】
FJ有3个砝码,质量分别为1,10,20个单位。他的天平最多只能承受质量为15个单位的物体。用质量为1和10的两个砝码可以称出质量为11的牛。这3个砝码所能组成的其他的质量不是比11小就是会压坏天平。
解析:这道题给了我一个很大的启发:直接用全排列的时间复杂度是n的阶乘,显然会爆炸,于是出现了一个很神奇的东东,折半搜索(不是二分查找!)先用全排列计算出左半边的所用情况(时间复杂度只有20的阶乘),快排一遍,在全排列枚举右半边的情况,用二分查找从左半边选出加上z(右边枚举的情况)能够最大的且<=c的数。

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
long long a[1001],n,f[1000001],c,len=0,t,ans,tt;
bool p[101];
long long find (long long l,long long r,long long z)//二分查找
{
    long long mid;
	while (l<=r)
	{
	     mid=(l+r)/2;
		if (f[mid]+z<=c) l=mid+1;
		else r=mid-1; 
	}
    return f[l-1]+z; 
}
void dfs (long long cc,long long z)//全排列
{
	if (t>n) f[++len]=z;
	else if (z<=c) ans=max(find(1,len,z),ans);
    if (cc>n) return;
	for (int i=cc;i<=n;i++)
			dfs (i+1,z+a[i]);
}
bool cmp (int a,int b)
{
	return a<b;
}
int main()
{
  cin>>n>>c;
  for (int i=1;i<=n;i++)
    cin>>a[i]; 
  t=n;
  n/=2;//折半搜索
  tt=c;
  dfs (1,0);
  c=tt;
  sort (f+1,f+len+1,cmp);  
  tt=n;n=t;t=tt;
  dfs (t+1,0);
  cout<<ans;
}
### 创建或调整Unity中的天平机制 在Unity中创建或调整天平机制涉及多个方面的考虑,包括物理模拟、物体交互以及视觉效果呈现。下面详细介绍具体方法: #### 物理组件设置 要使天平能够正常运作,需确保其各个部分都正确设置了刚体(Rigidbody)和碰撞器(Collider)[^1]。对于支点位置,则可以使用Hinge Joint或者Fixed Joint连接两个臂端,从而形成杠杆结构。 ```csharp // 设置关节参数示例代码 using UnityEngine; public class BalanceSetup : MonoBehaviour { public GameObject leftArm; // 左侧手臂对象 public GameObject rightArm;// 右侧手臂对象 void Start() { HingeJoint hinge = this.gameObject.AddComponent<HingeJoint>(); ConfigurableJoint jointConfig = (ConfigurableJoint)hinge; // 配置关节属性... } } ``` #### 力学平衡控制 为了让天平保持动态均衡状态,可以通过脚本编程方式检测两侧重量差异,并据此施加相应力矩来维持水平姿态。这通常涉及到质量计算、重力作用等因素的影响分析。 ```csharp void FixedUpdate(){ float torque = CalculateTorque(); Rigidbody rb = GetComponent<Rigidbody>(); if(rb != null){ rb.AddTorque(Vector3.up * torque); } } float CalculateTorque(){ // 计算扭矩逻辑... return 0f; } ``` #### 用户互动反馈 当玩家放置物品于托盘之上,应该给予即响应并更新显示结果。此过程可能牵涉到UI界面刷新、音效播放等功能模块的设计与实现。 ```csharp public void OnItemPlaced(float weightDifference){ UpdateScale(weightDifference); // 更新天平倾斜角度 PlaySoundEffect(); // 播放声音提示 } private void UpdateScale(float diff){ transform.RotateAround(pivotPoint, Vector3.right, anglePerUnitWeight*diff); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值