大疆创新C语言笔试,2019大疆笔试的一道编程题

本文介绍了一种算法,用于解决如何根据书的厚度和宽度合理分配在书架上层或下层,以实现书架宽度最小化的优化问题。通过计算每本书放置于下方时的总厚度和放置于上方时的总宽度,找出最佳组合,适用于N本书的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

输入T,表示有几组书的方案

输入N,表示该方案有N本书

输入N行,每行有h书的厚度,w书的宽度

要求:书架下层只能将书竖着放(只计算h厚度),上层只能将书横着放(只计算宽度w)

求书架的最小宽度。

*/

#include

#include

#include

using namespace std;

struct Differs

{

int differ;

int index;

Differs(int d, int i) : differ(d), index(i){}

};

bool comp(const Differs &a, const Differs &b)

{

return a.differ < b.differ;

}

int getMax(int a, int b)

{

if (a>b)

{

return a;

}

return b;

}

//N本书,h是厚度,w是宽度

int getMinWidth(int N, vector &h, vector &w)

{

int sumh = 0, sumw = 0;

int minW = 0;

//一本书如果放下面,那么只把厚度h加到sumh,如果放上面,则只把w加到sumw

//最后比较sumh和sumw,更小的就是答案。

//对于一本书,h-w的差值越小,越要放到下面那一层,即加到sumh

vector differs;

for (int i = 0; i < N; i++)

{

differs.push_back(Differs(h[i] - w[i], i));

}

sort(differs.begin(), differs.end(), comp);

for (int i = 0; i < N; i++)

{

sumh = sumh + h[differs[i].index];

sumw = 0;

for (int j = i + 1; j < N; j++)

{

sumw = sumw + w[differs[j].index];

}

int min = getMax(sumh, sumw);

if (0 == i)

{

minW = min;

}

if (min

{

minW = min;

}

}

return minW;

}

int main()

{

int T;

cin >> T;

vector minW;

//输入T组数据

for (int i = 0; i < T; i++)

{

int N; //N本书

cin >> N;

vector h, w;

for (int j = 0; j < N; j++)

{

int hj, wj;

//输入N本书的厚度和宽度

cin >> hj >> wj;

h.push_back(hj);

w.push_back(wj);

}

int minWi = getMinWidth(N, h, w);

minW.push_back(minWi);

}

for (int i = 0; i < T; i++)

{

cout << "#Case " << i + 1 << ":" << minW[i] << endl;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值