复盘8.17训练:UCF Local Programming Contest Final Round

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复盘8.17训练:UCF Local Programming Contest Final Round相关的知识,希望对你有一定的参考价值。

地址

A-A Corona Virus Testing

A

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int main()
{
	int zu,each,pos;cin>>zu>>each>>pos;
	int sum=0;
	sum+=zu;
	sum+=pos*each;
	int peo=zu*each;
	if(sum<peo) cout<<2;
	else if(sum==peo) cout<<0;
	else cout<<1;
	return 0; 
}

B-B Presidential Election

B

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
struct node
{
	int piao=0,zhou=0;
};
int main()
{
	node a,b;
	int n;cin>>n;
	for(int i=0;i<n;i++)
	{
		int aa,bb,cc;cin>>aa>>bb>>cc;
		a.piao+=bb;
		b.piao+=cc;
		if(bb>cc) a.zhou+=aa;
		else if(bb<cc) b.zhou+=aa;
	}
	if(a.piao>b.piao&&a.zhou>b.zhou) cout<<1;
	else if(a.piao<b.piao&&a.zhou<b.zhou) cout<<2;
	else cout<<0;
	return 0; 
}

C-C Microwave Mishap

C

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int main()
{
	string a;cin>>a;
	int fen1=0,miao1=0;
	for(int i=0;a[i];i++)
	{
		if(i==0||i==1)  fen1=fen1*10+a[i]-'0';
		else if(i==3||i==4) miao1=miao1*10+a[i]-'0';		
	}
	int shi2=0,fen2=0,miao2=0;
	shi2=fen1,fen2=miao1;
	miao1+=fen1*60;
	miao2+=shi2*60*60;
	miao2+=fen2*60;
	int miao=miao2-miao1;
	if(miao/3600>0)
	{
		if(miao/3600<10) cout<<0;
		cout<<miao/3600;
		miao%=3600;
	}
	else cout<<"00";
	cout<<":";
	if(miao/60>0)
	{
		if(miao/60<10) cout<<0;
		cout<<miao/60;miao%=60;
	}
	else cout<<"00";
	cout<<":";
	if(miao==0) cout<<"00";
	else
	{
		if(miao<10) cout<<0;
		cout<<miao;
	}
	return 0; 
}

E-E Making Connections

E
第一次见到并查集。根据自己理解写的超时代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
int pre[N];
map<int,ll>gs;
int n,m;
//并查集
int find(int x)  //找根 
{
	int r=x;
	while(pre[r]!=r)
	{
		r=pre[r];
	}
	
	//路径压缩
	int i=x,j;
	while(i!=r)//直接变的只有两层 
	{
		j=pre[i];
		pre[i]=r;
		i=j;
	}
	return r; 
}

void join(int x,int y)
{
	int fx=pre[x],fy=pre[y];
	if(fx!=fy)//不连通 
	{
		pre[fx]=fy;//fx是fy小弟后就连通 
	}
} 

int count()//并查集的个数:找根 
{
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		int f=find(i);
		if(f==i) ans++;
		gs[f]++;//一个并查集内的元素个数 
	}
	return ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++) pre[i]=i;//自己是自己的根 
	while(m--)
	{
		int t;cin>>t;
		if(t==1)
		{
			int a,b;cin>>a>>b;
			join(a,b);
		}
		else
		{
			ll yy=count();
			ll xx=0;
			for(int i=1;i<=n;i++)
			{
				if(gs[i]) xx+=(gs[i]*gs[i]);
			}
			ll zz=__gcd(xx,yy);
			xx/=zz;yy/=zz;
			cout<<xx<<"/"<<yy<<endl;
			gs.clear();
		}
	}
	return 0; 
}

改了之后的AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
int pre[N];
int find(int x)//如果找到根就返回,否则一直递归 
{
	return pre[x]==x?x:pre[x]=find(pre[x]);
}

void Union(int x,int y)//xy合并:后面是根 
{
	int xx=find(x),yy=find(y);
	pre[xx]=yy;
} 
int main()
{
	ios::sync_with_stdio(false);
	int n,m;cin>>n>>m;
	map<int,ll>mp;
	ll sum=0,count=0;
	for(int i=1;i<=n;i++) //根是自己
	{
		pre[i]=i;mp[i]=1;
	}
	sum=n,count=n;
	while(m--)
	{
		int a,b,c;cin>>a;
		if(a==1)
		{
			cin>>b>>c;
			int bb=find(b),cc=find(c);
			if(bb!=cc) //不在一个集合里 
			{
				sum-=(mp[bb]*mp[bb]*1ll);
				sum-=(mp[cc]*mp[cc]*1ll);
				mp[cc]+=mp[bb];
				Union(b,c);
				sum+=(mp[cc]*mp[cc]*1ll);
				count--;
			}
			
		}
		else if(a==2)
		{
			ll tmp=__gcd(sum,count);
			ll aa=sum/tmp,bb=count/tmp;
			cout<<aa<<"/"<<bb<<endl;
		}
	 } 
	return 0; 
}

学习并查集的参考资料:
很清晰的理论知识
实践知识

找根和合并的模板:

int find(int x)//如果找到根就返回,否则一直递归 
{
	return pre[x]==x?x:pre[x]=find(pre[x]);
}

void Union(int x,int y)//xy合并:后面是根 
{
	int xx=find(x),yy=find(y);
	pre[xx]=yy;
}

以上是关于复盘8.17训练:UCF Local Programming Contest Final Round的主要内容,如果未能解决你的问题,请参考以下文章

UCF Local Programming Contest Round 1A 训练联盟暑假场1 题解

UCF Local Programming Contest 2017训练联盟周赛

2020.3.28-ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016

03.28,周六,12:00-17:00,ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016正式赛。

UCF Local Programming Contest 2015

UCF Local Programming Contest 2017(2020-04-06)