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