(纪中)2169. 分数统计【并查集】

(File IO): input:score.in output:score.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制


题目描述
在统计完朋友情况之后,小明又对大家的毕业学校产生兴趣,但是他觉得单纯的统计人数是一件非常无聊的事情,于是他设计了一个算法,同一所学校毕业的学生,第 1 1 个将获得 1 1 分,第 2 2 个获得 2 2 分,第 3 3 个获得 4 4 分…,第 i i 个将获得 2 ( i 1 ) 2^(i-1) 分,总分就是这所小学的得分,小明想知道得分最高的学校有多少分。


输入
输入文件 s c o r e . i n score.in 的第一行有两个整数 n n m m n n 表示总人数, m m 表示已知的同校关系数量。
接下来 m m 行,每行有 2 2 个以空格隔开的整数 a a b b ,表示 a a 和b是来自同一所学校, a a b b 均为 1 1 n n 之间的整数。不会给出重复的信息。

输出
输出文件score.out只有一行,为所有学校中的最高得分。最后得分可能会很大,你只需要输出后100位即可,不足100位的请直接输出。


样例输入
5 3
1 2
3 4
1 3

样例输出
15


数据范围限制
60 60 %的数据, 1 < = n < = 10 1 <= n <= 10
80 80 %的数据, 1 < = n < = 70 1 <= n <= 70
100 100 %的数据, 1 < = n < = 10000 1 < = m < = 100000 1 <= n <= 10000,1 <= m <= 100000


提示
1 2 3 4 1、2、3、4 来自同一所学校,该所学校所得的分数为 1 + 2 + 4 + 8 = 15 1+2+4+8=15


解题思路
原本抱着AC的心态打这题,结果0分!
改题时一直说我运行时错误,足足改了两小时,最后发现是在函数中少打了一个 r e t u r n return 。。。低级错误
其实这道题就是先打一个并查集,再算出结果即可。因为数据较大,所以要使用高精度。


代码

#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]);
	}
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4937

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104527444