(File IO): input:score.in output:score.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
在统计完朋友情况之后,小明又对大家的毕业学校产生兴趣,但是他觉得单纯的统计人数是一件非常无聊的事情,于是他设计了一个算法,同一所学校毕业的学生,第
个将获得
分,第
个获得
分,第
个获得
分…,第
个将获得
分,总分就是这所小学的得分,小明想知道得分最高的学校有多少分。
输入
输入文件
的第一行有两个整数
和
,
表示总人数,
表示已知的同校关系数量。
接下来
行,每行有
个以空格隔开的整数
和
,表示
和b是来自同一所学校,
和
均为
到
之间的整数。不会给出重复的信息。
输出
输出文件score.out只有一行,为所有学校中的最高得分。最后得分可能会很大,你只需要输出后100位即可,不足100位的请直接输出。
样例输入
5 3
1 2
3 4
1 3
样例输出
15
数据范围限制
%的数据,
%的数据,
%的数据,
提示
来自同一所学校,该所学校所得的分数为
解题思路
原本抱着AC的心态打这题,结果0分!
改题时一直说我运行时错误,足足改了两小时,最后发现是在函数中少打了一个
。。。低级错误
其实这道题就是先打一个并查集,再算出结果即可。因为数据较大,所以要使用高精度。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,a[20010],x,y,xx,yy,fat[20010],ans[20010],l,maxn,k,x1;
int getfather(int z){
if(fat[z]==0)
return z;
return fat[z]=getfather(fat[z]);
}
int main()
{
freopen("score.in","r",stdin);
freopen("score.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
a[i]=1;
for(int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
xx=getfather(x);
yy=getfather(y);
if(xx!=yy)
{
fat[xx]=yy;
a[yy]=a[xx]+a[yy];
if(a[yy]>maxn)
maxn=a[yy];
}
}
l=1;
ans[1]=1;
for(int i=1; i<=maxn; i++)
{
x1=0;
for(int j=1; j<=l; j++)
{
ans[j]=ans[j]*2+x1;
x1=ans[j]/10;
ans[j]=ans[j]%10;
}
if(x1>0)
{
l++;
ans[l]=x1;
}
if(l>100)
l=100;
}
ans[1]=ans[1]-1;
k=1;
while(ans[k]<0)
{
ans[k]+=10;
ans[k+1]--;
k++;
}
for(int i=l;i>=1;i--)
{
if(ans[l]!=0)
printf("%d",ans[i]);
}
}