方法一:暴力求解,超時涼涼~~
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 }