复盘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
#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
#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
#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正式赛。