pat -06复习 并查集部分 以及排序前三道

//1118 并查集 
#include<bits/stdc++.h>
using namespace std;
int fa[10009];
int find(int x){
    int a=x;
	while(x!=fa[x]){
		x=fa[x];
	}
	while(a!=fa[a]){
		int z=a;
		a=fa[a];
		fa[z]=x;
	}
	return x;
}
void unionn(int a,int b){
	int f1=find(a);
	int f2=find(b);
	if(f1!=f2){
		fa[f1]=f2;
	}
}
int book[10009];//一定要放外面放外面一开始才都是0 
int main(){
	for(int i=0;i<10009;i++){
		fa[i]=i;
	}
	int n,_1,_2,_3;
	scanf("%d",&n);
	set<int> sum;
	for(int i=0;i<n;i++){
		scanf("%d%d",&_1,&_2);
		sum.insert(_2);
		for(int j=0;j<_1-1;j++){
			scanf("%d",&_3);
			sum.insert(_3);
			unionn(_2,_3);
		}
	}
	int cnt=0;
	for(int i=1;i<=sum.size();i++){
		book[find(i)]++;
	}
	for(int i=1;i<=sum.size();i++){
		if(book[i]>0){
			cnt++;
		}
	}
	printf("%d %d\n",cnt,sum.size());
	int k,_5,_6;
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d%d",&_5,&_6);
		if(find(_5)==find(_6)){
			printf("Yes\n");
		}else{
			printf("No\n");
		}
	}
	return 0;
}
//1114 并查集 
#include<bits/stdc++.h> //耗时比较长 
using namespace std;
struct pri{
	double num,ara;
};
struct node{
int	minid,num;
double sumnum,sumar;
};
bool cmp(node&a,node&b){
	if(a.sumar!=b.sumar){
		return a.sumar>b.sumar;
	}else{
		return a.minid<b.minid;
	}
}
int fa[10000];
int find(int x){
	int a=x;
	while(x!=fa[x]){
		x=fa[x];
	}
	while(a!=fa[a]){
		int z=a;
		a=fa[a];
		fa[z]=x;
	}
	return x;
}
void unionn(int a,int b){
	int f1=find(a);
	int f2=find(b);
	if(f1!=f2){
		fa[f1]=f2;
	}
}
int book[10000],book1[10000];
int main(){
	for(int i=0;i<10000;i++){
		fa[i]=i;
	}
	set<int> a;
	map<int,pri> geti;
	map<int,int> anst;
	int n,_1,_11,_22,_3,_4;
	double _5,_6;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d%d%d",&_1,&_11,&_22,&_3);
		a.insert(_1);
		if(_22!=-1){
		unionn(_1,_22);
        a.insert(_22);
		}
		if(_11!=-1){
		unionn(_1,_11);
	    a.insert(_11);
		}
		for(int j=0;j<_3;j++){
			scanf("%d",&_4);
			unionn(_1,_4);
			a.insert(_4);
		}
		scanf("%lf%lf",&_5,&_6);
		pri temp=pri{_5,_6};
		geti[_1]=temp;
	}
	
	vector<node> ans;
	int nt=0,cnt=0;
	for(auto it=a.begin();it!=a.end();it++){
		 if(book1[find(*it)]==0){
		 	anst[find(*it)]=nt;
		 	nt++;
		 	ans.push_back({*it});//有只赋值一次的变量直到根不同再申请其他空间 
		    book1[find(*it)]=1;
		    cnt++;
		 }
		 ans[anst[find(*it)]].num++;
		 ans[anst[find(*it)]].sumnum+=geti[*it].num;
		 ans[anst[find(*it)]].sumar+=geti[*it].ara;
	}
	for(int i=0;i<ans.size();i++){
		ans[i].sumnum=ans[i].sumnum/ans[i].num;
		ans[i].sumar=ans[i].sumar/ans[i].num;
	}
	sort(ans.begin(),ans.end(),cmp);
	printf("%d\n",cnt);
	for(int i=0;i<ans.size();i++){
		printf("%04d %d %.3lf %.3lf\n",ans[i].minid,ans[i].num,ans[i].sumnum,ans[i].sumar);
	}
	return 0;
}
//1107 并查集 
#include<bits/stdc++.h>
using namespace std;
int fa[1010];
int book[1010];
int find(int x){
    int a=x;
	while(x!=fa[x]){
		x=fa[x];
	}
	while(a!=fa[a]){
		int z=a;
		a=fa[a];
		fa[z]=x;
	}
	return x;
}
void unionn(int a,int b){
	int f1=find(a);
	int f2=find(b);
	if(f1!=f2){
		fa[f1]=f2;
	}
}
bool cmp(int&a,int &b){
	return a>b;
}
vector<int> a[1010];
int main(){
	for(int i=0;i<1010;i++){//并查集先初始化 
		fa[i]=i;
	}
	int n,_1,_2;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d:",&_1);
		for(int j=0;j<_1;j++){//for循环内外计数参数重名 
			scanf("%d",&_2);
			a[_2].push_back(i);
		}
	}
	for(int i=1;i<1010;i++){
		if(a[i].size()!=0){
			for(int j=1;j<a[i].size();j++){
				unionn(a[i][0],a[i][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){//对应下表很重要不要有多余 
		book[find(i)]++;
	}
	int cnt=0;
	vector<int> ans;
	for(int i=1;i<=n;i++){
		if(book[i]>0){
			cnt++;
	    ans.push_back(book[i]);
		}
	}
	sort(ans.begin(),ans.end(),cmp);
	printf("%d\n",cnt);
	for(int i=0;i<ans.size();i++){
		if(i!=0) printf(" ");
		printf("%d",ans[i]);
	}
	return 0;
}
//1002
#include<bits/stdc++.h>
using namespace std;
double book[1009];
int main(){
	int k,_1;
	double _2; 
	for(int i=0;i<2;i++){
		scanf("%d",&k);
		for(int j=0;j<k;j++){
			scanf("%d%lf",&_1,&_2);
			book[_1]+=_2;
		}
	}
	int cnt=0;
	for(int i=0;i<1009;i++){
		if(book[i]!=0){
			cnt++;
		} 
	}
	printf("%d",cnt);
	for(int i=1008;i>=0;i--){
		if(book[i]!=0){
			printf(" %d",i);
			printf(" %.1lf",book[i]);
		}
	}
	return 0;
}
//1006
#include<bits/stdc++.h>
using namespace std;
int swit(string a){
	int h=stoi(a.substr(0,2));
	int m=stoi(a.substr(3,2));
	int s=stoi(a.substr(6,2));
	return h*3600+m*60+s;
}
struct node{
	string id;
	int in,out;
};
int flag=0;
bool cmp(node&a,node&b){
	if(flag==0){
		return a.in<b.in;
	} else{
		return a.out>b.out;
	}
}
vector<node> aa;
int main(){
	int n;
	scanf("%d",&n);
	string _1,_2,_3;
	for(int i=0;i<n;i++){
		cin>>_1>>_2>>_3;
		aa.push_back({_1,swit(_2),swit(_3)});
	}
	sort(aa.begin(),aa.end(),cmp);
	string an1=aa[0].id;
	flag=1;
	sort(aa.begin(),aa.end(),cmp);
	string an2=aa[0].id;
	printf("%s %s",an1.c_str(),an2.c_str());
	return 0;
}
//1012 名词不要过度省略 尽量形象一些  find 判map结构体键值对空 
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long int id;
	int gr[4];
	int ra[4];
	int ber;
	int be;
};
int flag=0;
bool cmp(node&a,node&b){
	return a.gr[flag]>b.gr[flag];
}
int main(){
	int n,m,nt=0;
	long long int _1;
	int _2,_3,_4;
	double _5;
	map<int,node> xu;//处理完后统一建键值对 
	scanf("%d%d",&n,&m);
	vector<node> ans(n);
	for(int i=0;i<n;i++){
		scanf("%lld%d%d%d",&_1,&_2,&_3,&_4);
		_5= (_2+_3+_4)/3*1.0+0.5;//
		ans[nt].gr[0]=_5;
		ans[nt].gr[1]=_2;
		ans[nt].gr[2]=_3;
		ans[nt].gr[3]=_4;
		ans[nt].id=_1;
		nt++;
	}
	for(int i=0;i<4;i++){
		flag=i;
		sort(ans.begin(),ans.end(),cmp);
		ans[0].ra[i]=1;
		for(int j=1;j<ans.size();j++){
		//	ans[j].ra[i]=ans[j-1].gr[i] ==ans[j].gr[i]?ans[j-1].gr[i]:j+1;
		ans[j].ra[i]=ans[j-1].gr[i] ==ans[j].gr[i]?ans[j-1].ra[i]:j+1;//等于前一个排名而不是gra 
		}//名词不要过度省略 尽量形象一些 
	}
		/*	for(  flag=0;flag<=3;flag++){//flag是全局变量不能另外声明一个(注意) 

		sort(ans.begin(),ans.end(),cmp);

		ans[0].ra[flag]=1;

		for(int i=1;i<n;i++){

			
			ans[i].ra[flag]=i+1;

			if(ans[i].gr[flag]==ans[i-1].gr[flag]){

				ans[i].ra[flag]=ans[i-1].ra[flag];

			}

		}

	}*/

	for(int i=0;i<ans.size();i++){
		ans[i].ber=ans[i].ra[0];
		ans[i].be=0;
		for(int j=1;j<4;j++){
			if(ans[i].ra[j]<ans[i].ber){
				ans[i].ber=ans[i].ra[j];
				ans[i].be=j;
			}
		}
		xu[ans[i].id]=ans[i];
	}
	int _7;
	char we[4]={'A','C','M','E'};
	for(int i=0;i<m;i++){
		scanf("%d",&_7);
		if(xu.find(_7)!=xu.end())//map与结构体建立键值对判空方式使用find函数 
		printf("%d %c\n",xu[_7].ber,we[xu[_7].be] );
		else {
			printf("N/A\n");
		}
	}
	return 0;
}

6道

总结

并查集部分 初始化 查 并

排序查找stl部分注意小细节 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值