/*
輸入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繪制背景圖片的...