/*
输入T,表示有几组书的方案
输入N,表示该方案有N本书
输入N行,每行有h书的厚度,w书的宽度
要求:书架下层只能将书竖着放(只计算h厚度),上层只能将书横着放(只计算宽度w)
求书架的最小宽度。
*/
#include<iostream>
#include<vector>
#include<algorithm>
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<int> &h, vector<int> &w)
{
int sumh = 0, sumw = 0;
int minW = 0;
//一本书如果放下面,那么只把厚度h加到sumh,如果放上面,则只把w加到sumw
//最后比较sumh和sumw,更小的就是答案。
//对于一本书,h-w的差值越小,越要放到下面那一层,即加到sumh
vector<Differs> 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)
{
minW = min;
}
}
return minW;
}
int main()
{
int T;
cin >> T;
vector<int> minW;
//输入T组数据
for (int i = 0; i < T; i++)
{
int N; //N本书
cin >> N;
vector<int> 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;
}
}
2019大疆笔试的一道编程题
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前两天在考京东的笔试题时,一道大题编程题未做出来,然后就接了图打算考试结束再思考。在今天终于有了一个比较清晰的思路...
- 首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作。AC思路:采用暴力枚举每种可能的分...
- 一、单项选择题 SVM 分类和深度学习分类B. SVM 只能应用于线性分类 错误,SVM 可以应用于线性分类和非线...
- Shape生成图形,既简单有实用,灵活性比较大,而且可以减少包的大小:Android 使用Shape绘制背景图片的...