(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]);
}
}