我只能说牛逼啦
我的思路 后面超时 for循环太多了
#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
struct node{
int index,fre;
};
bool cmp(node&a,node&b){
if(a.fre!=b.fre) return a.fre>b.fre;
else return a.index<b.index;
}
vector<int> a;
vector<node> ans;
int main(){
int n,m,temp;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>temp;
a.push_back(temp);
}
for(int i=1;i<a.size();i++){
ans.clear();
unordered_map<int,int> frr;
set<int>num;
for(int j=i-1;j>=0;j--){
num.insert(a[j]);
frr[a[j]]++;
/*if(num.size()==m||j==0){//注意到最开始元素的情况 异常的output例子就是要注意的地方
for(auto it=num.begin();it!=num.end();it++){
ans.push_back({*it,frr[*it]} );
}
sort(ans.begin(),ans.end(),cmp);
for(int q=0;q<ans.size();q++){
if(q==0) printf("%d:",a[i]);
printf(" %d",ans[q]);
if(q==ans.size()-1) printf("\n");
}
break;
}*/
}
for(auto it=num.begin();it!=num.end();it++){
ans.push_back({*it,frr[*it]} );
}
sort(ans.begin(),ans.end(),cmp);
int y=ans.size();
int mn=min(y,m);
for(int q=0;q<mn;q++){
if(q==0) printf("%d:",a[i]);
printf(" %d",ans[q]);
if(q==mn-1) printf("\n");
}
}
return 0;
}
大佬思路
#include<iostream>
#include<set>
using namespace std;
struct node{
int index,fre;
bool operator <(const node&a)const{//重载这要加const,两个(注意)
return (fre!=a.fre) ? fre>a.fre: index<a.index;
}
};
int book[50009];
set<node> ans;
int main(){
int n,m,temp;
cin>>n>>m;
for(int i=0;i<n;i++){
int cnt=0;
scanf("%d",&temp);
if(i!=0){
printf("%d:",temp);
for(auto it=ans.begin();it!=ans.end()&&cnt<m;it++){
printf(" %d",it->index);//set里面访问node元素it->index(注意)
cnt++;
}
printf("\n");
}
auto pos=ans.find(node {temp,book[temp]});//找结点要加node,前面要是auto(注意)
if(pos!=ans.end())ans.erase(pos);//有可能为空就会出现错误
book[temp]++;
ans.insert({temp,book[temp]});
}
return 0;
}
总结1.我的思路是 用set 做一个索引,用键值对map做一个与次数的对应,最后在汇总在结构体node的vector中,使用sort进行排序
2.大佬的思路 ,重载小于号<,实现在set里的顺序就是答案的顺序,并且充分利用题目中的规律,每次增加一个只是改变了增加的那个数的次数,前面的不用变,少了很多重复性的工作,我就是每次再重新统计一遍,所以RE
3.bool operator <(const node&a)const{//重载这要加const,两个(注意)
4. printf(" %d",it->index);//set里面访问node元素it->index(注意)
5. auto pos=ans.find(node {temp,book[temp]});//找结点要加node,前面要是auto(注意)
6.if(pos!=ans.end())ans.erase(pos);//有可能为空就会出现错误
英语
1.
问题 操作符重载不清晰