测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27381. 滑雪板打包问题

填空题 较易

题目描述

滑雪板打包问题

题目描述

一家新开业的滑雪场,需要采购不同规格的滑雪板,每个滑雪板的长度是不固定 的,现在需要把排列好的滑雪板用木板做成木箱封装好进行快递,每次快递的总重 量是有限制的,不能超过重量 G。只要每次打包的重量不超过 G,多个滑雪板可以摞 放在一起,使用与最长滑雪板长度相同的两个木板进行固定。假设,给出排列好的 每个滑雪板的重量 Gi ,和长度 Li ,请计算需要最少多长的木板才能将所有的滑雪板 把包好。

输入格式

输入的第一行有两个数字,一个是滑雪板的个数,一个是包裹总重量。 以下滑雪板个数行,每行的第一个数是滑雪板的重量Gi 和长度 Li。

输出格式

输出需要最少的木板的总长度。注:每次打包需要 2 个木板。

样例输入(测试数据不包含本样例)

5 5
2 1
1 2
1 3
2 3 
2 2

样例输出

10

参考答案

#include <iostream > #include <vector> #include <algorithm > using namespace std; int main() { int n, G; cin > > n > > G; vector<pair<int, int> > skis(n); for (int i = 0; i < n; i ++) { cin > > skis [i].first > > skis [i].second; } int total_length = 0; int current_weight = 0; int max_len = 0; for (int i = 0; i < n; i ++) { if (current_weight + skis [i].first < = G) { current_weight + = skis [i].first; max_len = max(max_len, skis [i].second); } else { total_length + = 2 * max_len; current_weight = skis [i].first; max_len = skis [i].second; } } // 处理最后一组 total_length + = 2 * max_len; 32 cout < < total length < < endl;

答案解析

问题分析 :将滑雪板分组打包 ,每组的总重量不超过 G ,每组需要两块木板 ,长度为该组中最长滑雪板的长度。 目标是求所有木板的最小总长度。

关键步骤 :

● 贪心算法 :尽量将滑雪板按顺序分组 ,使得每组的总重量不超过 G ,同时记录每组的最长长度。

● 每组需要两块木板 ,总长度为所有组长度的两倍之和。

边界条件 :滑雪板的顺序不能改变 ,必须按输入顺序分组。

上一题 下一题