1、利用自定義的排序函數
通過傳遞一個函數 cmp給sort函數 , 注意: cmp中return a<b; 決定為從小到大的排序
return a>b; 決定為從大到小的排序
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> using namespace std; bool cmp(const pair<int, char> a, const pair<int, char> b) { return a.first<b.first;//自定義的比較函數 } int main() { vector<pair<int, char>> p; p.push_back(make_pair(10, 'a')); p.push_back(make_pair(9, 'c')); p.push_back(make_pair(10, 't')); p.push_back(make_pair(17, 'y')); p.push_back(make_pair(10, 'b')); sort(p.begin(), p.end(), cmp);//按照第一個元素排序 for (auto i = 0; i<p.size(); i++) cout << p[i].first << " " << p[i].second << endl; system("pause"); return 0; }
2、自定義字符串的排序函數
(1)排序的比較方式,長度相同則字母排序,否則長度排序
在函數中定義時不用將比較函數定義為靜態成員函數。
//排序的比較方式,長度相同則字母排序,否則長度排序 bool compare( string s1, string s2) { if (s1.size() == s2.size()) return s1 < s2; else if (s1.size() < s2.size()) return true; return false; }
(2)字符串數組排成最小的數
在c++類中自定義比較函數時,需注意類中比較函數聲明為靜態成員函數。
static bool compare(const string& a,const string& b) { string s1 = a+b; string s2 = b+a; return s1<s2; }
3、舉例:調整塔的高度
給出塔的數量n和調整最大次數k,以及每個塔的高度,在有限次數內調整塔的高度,使最大塔差最小。
輸入:3 2
5 8 5
輸出:0 2
2 1
2 3
使用pair結構保存數據。
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> #include<map> using namespace std; bool cmp(pair<int, int>& a, pair<int, int>& b) { // 開始沒寫這個 if,卡在 20% ,加上100% // 減的時候,先拿編號大的;加的時候,先拿編號小的 if (a.second == b.second) { return a.first > b.first; } return a.second > b.second; } int main() { int n, k; while (cin >> n >> k) { vector<pair<int, int>> nums; vector<pair<int, int>> res; for (int i = 0; i < n; ++i) { int temp; cin >> temp; nums.push_back(make_pair(i + 1, temp)); } for (int i = 0; i < k; ++i) { sort(nums.begin(), nums.end(), cmp); if (nums[0].second - nums[n - 1].second <= 1) break; nums[0].second--; nums[n - 1].second++; res.push_back(make_pair(nums[0].first, nums[n - 1].first)); } sort(nums.begin(), nums.end(), cmp); cout << nums[0].second - nums[n - 1].second << " " << res.size() << endl; for (int i = 0; i < res.size(); ++i) { cout << res[i].first << " " << res[i].second << endl; } } system("pause"); return 0; }
