1129 Recommendation System


方法一:暴力求解,超時涼涼~~

 1 #include<iostream>
 2 #include<unordered_map>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 bool cmp(const pair<int,int> &a,const pair<int,int> &b) {
 8     if(a.second != b.second) return a.second > b.second;
 9     else  return a.first < b.first;
10 }
11 int main() {
12     int n,k,index;
13     scanf("%d%d",&n,&k);
14     unordered_map<int,int> mp;
15     for(int i = 0; i < n; ++i) {
16         scanf("%d",&index);
17         if(mp.size() > 0) {
18             printf("%d:",index);
19             vector<pair<int,int> > v(mp.begin(),mp.end());
20             sort(v.begin(),v.end(),cmp);
21             for(int i = 0; i < v.size() && i < k; ++i)
22                 printf(" %d",v[i]);
23             printf("\n");
24         }
25         mp[index]++;
26     }
27     return 0;
28 }

方法二:

用map1記錄結點和其出現次數。

用map2記錄 結點最小且出現次數最多 的前 K 個結點。

用map2初始化vector,排序后輸出vector中的元素。

看了三小時,,,依然不知道測試點1 錯哪了。

 1 #include<iostream>
 2 #include<unordered_map>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 bool cmp(const pair<int,int> &a,const pair<int,int> &b) {
 8     if(a.second != b.second) return a.second > b.second;
 9     else  return a.first < b.first;
10 }
11 int main() {
12     int n,k,index;
13     scanf("%d%d",&n,&k);
14     unordered_map<int,int> mp,ans;
15     for(int i = 0; i < n; ++i) {
16         scanf("%d",&index);
17         vector<pair<int,int> > v(ans.begin(),ans.end());
18         sort(v.begin(),v.end(),cmp);
19         if(v.size() > 0) {
20             printf("%d:",index);
21             for(int i = 0; i < v.size() && i < k; ++i)
22                 printf(" %d",v[i]);
23             printf("\n");
24         }
25         mp[index]++;
26         if(ans.size() < k) ans[index]++; //不足k個,直接放入
27         else if(ans.count(index)) ans[index]++; //index 已經存在
28         else if((v.rbegin()->second == mp[index] && v.rbegin()->first > index) ||(v.rbegin()->second < mp[index])) {//換另一個index
29             ans.erase(v.rbegin()->first);
30             ans[index]++; //錯誤 31         }
32     }
33     return 0;
34 }

寫這個題解的時候突然找出問題了,就是 刪除map2中的鍵值對時,應該要插入map1中的鍵值對,真是馬虎啊~~浪費時間

 1 #include<iostream>
 2 #include<unordered_map>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 bool cmp(const pair<int,int> &a,const pair<int,int> &b) {
 8     if(a.second != b.second) return a.second > b.second;
 9     else  return a.first < b.first;
10 }
11 int main() {
12     int n,k,index;
13     scanf("%d%d",&n,&k);
14     unordered_map<int,int> mp,ans;
15     for(int i = 0; i < n; ++i) {
16         scanf("%d",&index);
17         vector<pair<int,int> > v(ans.begin(),ans.end());
18         sort(v.begin(),v.end(),cmp);
19         if(v.size() > 0) {
20             printf("%d:",index);
21             for(int i = 0; i < v.size() && i < k; ++i)
22                 printf(" %d",v[i]);
23             printf("\n");
24         }
25         mp[index]++;
26         if(ans.size() < k) ans[index]++; //不足k個,直接放入
27         else if(ans.count(index)) ans[index]++; //index 已經存在
28         else if((v.rbegin()->second == mp[index] && v.rbegin()->first > index) ||(v.rbegin()->second < mp[index])) {//替換為mp[index] 
29             ans.erase(v.rbegin()->first);
30             ans[index] = mp[index]; //正確
31         }
32     }
33     return 0;
34 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM