回復 1# may - #include<bits/stdc++.h>
- using namespace std;
- int n;
- map<string, int> mp;
- vector<pair<string, int>> v;
- string s;
- /*
- n:顧客人數。
- mp:紀錄每個水果組合出現的次數,鍵為「水果1 水果2」的字串。
- v:存放最終要排序用的 pair(水果組合,次數)。
- s:輔助字串,讀入用。*/
- void putIn(vector<string> v)
- {
- int len=v.size();
- for(int i=0; i<len-1; i++)
- {
- for(int j=i+1; j<len; j++)
- {
- string s1=v[i], s2=v[j];
- if(s1>s2)
- swap(s1, s2);
- mp[s1+" "+s2]++;
- }
- }
- }
- /*
- 這段程式的目的是:
- 每位顧客買的水果中,兩兩列出所有可能組合,並按照字典序(小→大)做字串組合作為鍵值,對應的值為出現次數。
- */
- bool compare(pair<string, int> p1, pair<string, int> p2)
- {
- if(p1.second==p2.second)
- return p1.first>p2.first;
- else
- return p1.second>p2.second;
- }
- /*
- 符合題目排序規則:
- 優先依照購買次數多排在前面。
- 如果次數相同,則依水果組合的字典序由大到小排。
- */
- int main()
- {
- cin>>n;
- getline(cin, s);
- for(int i=0; i<n; i++)
- {
- getline(cin, s);
- stringstream ss;
- ss<<s;
- vector<string> v;
- string str;
- while(ss>>str)
- v.push_back(str);
- putIn(v);
- }
- /*
- 這段程式碼會
- 將每一行(顧客的水果清單)拆分成字串陣列,
- 然後丟到 putIn 裡處理所有可能的水果組合。
- */
- for(auto p: mp)
- v.push_back({p.first, p.second});
- /*
- 將 map 裡的資料轉成 vector<pair<string, int>> 好進行排序。
- */
- sort(v.begin(), v.end(), compare);
- /*
- 使用自定義的 compare 進行排序。
- */
- for(int i=0; i<3; i++)
- cout<<v[i].first<<" "<<v[i].second<<endl;
- return 0;
- }
複製代碼 |