題目描述 小王手裏有點閒錢,想着作點賣水果的小買賣,給出兩個數組m、n,用m[i]表示第i個水果的成本價,n[i]表示第i個水果能賣出的價錢,假如如今有本錢k元,試問最後最多能賺多少錢?ios
說明: 1.每種水果只能買一次,只能賣一次; 2.數組m,n大小不超過50; 3.數組元素爲正整數,不超過1000。數組
輸入描述 1.數組m, n; 2.本錢k 備註: 1.首行輸入逗號分隔的數組m的元素值 2.第二行輸入逗號分隔數字n的元素值 3.第三行輸入本錢spa
輸出描述 最多能賺多少錢。.net
示例1 輸入 4,2,6,4 5,3,8,7 15 輸出 22code
說明 樣例計算過程: 先買前3種水果,所有賣出,再買第4種水果,再賣出,最後本金變爲22。 (感受這個說明解釋不正確……不是正確的解題思路……) <br><br>blog
1.思考排序
2.知識點ci
3.實現get
<br> ``` #include <iostream> #include <vector> #include <string> #include <algorithm> #include <numeric> using namespace std;input
int Str2Num(string s){ int len = s.size(); int n = 0; for (int i = 0; i < len; i++){ n = n * 10 + s[i] - '0'; } return n; }
void Apart(string str, vector<int>& num){ int pos, n, len; string s; while (!str.empty()){ len = str.size(); pos = str.find(','); if (pos > 0){ s = str.substr(0, pos); n = Str2Num(s); num.push_back(n); str = str.substr(pos + 1, len-pos-1); } else{ n = Str2Num(str); num.push_back(n); break; } } }
bool comp(pair<int, double>& a, pair<int, double>& b){ return a.second > b.second; }
int main(){ string inputm, inputn;
while (getline(cin, inputm)){ //Input vector<int> m, n; int lenin = inputm.size(); getline(cin, inputn); int k; cin >> k; Apart(inputm, m); Apart(inputn, n); //Calculate average profit and sort it int len = m.size(); vector<pair<int, double>> avr; for (int i = 0; i < len; i++){ avr.push_back(make_pair(i, (n[i] - m[i]) / (1.0*m[i]))); } sort(avr.begin(), avr.end(), comp); //Buy and sell vector<int> visit(len, 0), win; int i, idx, klast=-1; bool brk = false; while (!avr.empty()){ i = 0; while (i < len){ idx = avr[i].first; if (visit[i]==0 && m[i] < k){ k -= m[i]; win.push_back(n[i]); visit[i] = 1; } i++; } k += accumulate(win.begin(), win.end(), 0); win.clear(); if (k == klast) break; klast = k; } cout << k << endl; } return 0;
}