pat-1129

我只能说牛逼啦

我的思路  后面超时 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.

扫描二维码关注公众号,回复: 12379215 查看本文章

问题  操作符重载不清晰

 

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/113061325