3月2日 贪心 体重限制下尽可能少使用船只来运送人员的问题(纪念品分组)

这段代码是一种贪心算法,用于解决在体重限制下尽可能少使用船只来运送人员的问题。以下是这段代码的逐行分析:

#include <bits/stdc++.h> // 引入所有标准库
using namespace std;

const int N=1e5+9; // 定义数组上限
int a[N]; // 用来存储每个人的重量

int main()
{
  int w, n; cin >> w >> n; // 输入船的最大负载 w 和人数 n
  for(int i = 1; i <= n; ++i) cin >> a[i]; // 输入每个人的重量
  
  sort(a + 1, a + 1 + n); // 将重量进行排序
  
  int l = 1, r = n; // 设置双指针,一个指向最轻的人,一个指向最重的人
  int ans = 0; // 记录所需最少船只数量
  
  while(l <= r)
  {
    
    if(l == r) // 如果指针相遇,说明剩余最后一个人
    {
      ans++;
      break;
    }
    
    if(a[l] + a[r] <= w) // 如果最轻和最重的人组合不超过船的载重,则他们可以共乘一艘船
    {
      l++, r--; // 移动两端指针
      ans++; // 增加使用的船只数量
    }
    else r--, ans++; // 否则,仅最重的人单独乘坐一艘船,并移动右端(最重)指针
  }
  
  cout << ans << endl; // 输出结果

  return 0;
}

该算法先对所有人按体重进行排序。然后使用双指针策略:一个从前往后表示当前可选中最轻者,另一个从后往前表示当前可选中最重者。通过比较两个指定位置处人员体重之和与船只承载能力:

  • 如果两个可以共同乘坐一条船(即总体量不超过w),则将两者放置在同一艘船上,并将索引分别向内移动;
  • 若不能,则将较重者独自安排在一条船上,并继续检查下一位较轻者。

这种方法确保了每次我们都是在尽可能地利用每一条可用的舱位来装载当前剩余中最沉和/或最轻者。程序以 ��� 标记所需要的总共使用了多少条船,并且当左右指针相遇(意味着已经检查完毕所有等待搭载之人)时结束处理过程。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值