部落
题目链接
题意:每个人都有自己的部落,认为朋友的朋友属于同一个部落,即集合中有共同元素就属于同一个部落。要求判断出这个社区的总人数、以及互不相交的部落的个数,随后对每一次查询,判断两个人是否属于同一个部落,属于则输出“Y”,否则输出“N”。
错点:被扣了四分。。
以下是错误代码。。。但是不清楚为什么会错
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N],f[N];
typedef pair<int,int> pii;
int n,m;
char d;
//部落数量,总人数
int mount=1,ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k);
int flag=0;
int idx=0;
for(int j=1;j<=k;j++)
{
scanf("%d",&a[j]);
ans=max(ans,a[j]);
if(f[a[j]]!=0)
{
flag=1;
idx=f[a[j]];
}
}
if(flag==1)
{
for(int j=1;j<=k;j++)
{
f[a[j]]=idx;
//cout<<a[j]<<" "<<f[a[j]]<<endl;
}
}
else
{
for(int j=1;j<=k;j++)
{
f[a[j]]=mount;
//cout<<a[j]<<" "<<f[a[j]]<<endl;
}
mount++;
}
}
cout<<ans<<" "<<mount-1<<endl;
scanf("%d",&m);
while(m--)
{
int q,d;
scanf("%d%d",&q,&d);
if(f[q]==f[d]&&f[q]!=0&&f[d]!=0&&q<=ans&&d<=ans)
{
cout<<"Y"<<endl;
//cout<<f[q]<<" "<<f[d]<<endl;
}
else
{
cout<<"N"<<endl;
//cout<<f[q]<<" "<<f[d]<<endl;
}
}
return 0;
}
正确代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N];
int n,m;
char d;
//部落数量,总人数
int mount=1,ans=0;
set<int> pe;
bool vi[N];
int find(int x)
{
int r=x;
while(a[r]!=r)
{
r=a[r];
}
return r;
}
void un(int x,int y)
{
int px=find(x);
int py=find(y);
if(px<py) a[py]=px;
else a[px]=py;
}
int main()
{
for(int i=0;i<10001;i++) a[i]=i;
cin>>n;
int k,x,y;
for(int i=0;i<n;i++)
{
scanf("%d%d",&k,&x);
pe.insert(x);
for(int j=0;j<k-1;j++)
{
scanf("%d",&y);
pe.insert(y);
un(x,y);
x=y;
}
}
for(int i=1;i<=pe.size();i++)
{
int pi=find(i);
if(vi[pi]==0) ans++,vi[pi]=1;
}
cout<<pe.size()<<" "<<ans<<endl;
cin>>k;
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
if(find(x)==find(y)) printf("Y\n");
else printf("N\n");
}
return 0;
}
二叉树的最大路径和
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int Max=INT_MIN;
int n=1;
int maxsum(int root)
{
if(root>n||a[root]==0) return 0;
int l=max(0,maxsum(root<<1));
int r=max(0,maxsum(root<<1|1));
Max=max(Max,l+r+a[root]);
return max(l,r)+a[root];
}
int main(){
while(cin>>a[n++]);
n--;
maxsum(1);
cout<<Max;
return 0;
}
集合相似度
原题链接
暴力,最后一个测试点超时了
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
int a[N][N];
int num[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k;
cin>>k;
int d=1;
map<int,int> mp;
for(int j=1;j<=k;j++)
{
int s;
cin>>s;
if(mp[s]==0)
{
a[i][d]=s;
d++;
mp[s]=1;
}
else continue;
}
num[i]=d-1;
}
cin>>m;
while(m--)
{
int x,y;
cin>>x>>y;
//sort(a[1]+1,a[1]+1+num[1]);
//sort(a[1]+1,a[1]+1+num[1]);
int x1=max(num[x],num[y]);
int x2=min(num[x],num[y]);
if(x1==num[y])
{
int t;
t=x;
x=y;
y=t;
}
double ans,cnt=0,mount=num[x]+num[y];
for(int i=1;i<=x2;i++)
{
for(int j=1;j<=x1;j++)
{
if(a[y][i]==a[x][j])
{
cnt++;
}
}
}
mount-=cnt;
ans=cnt/mount*100;
printf("%.2f%\n",ans);
}
return 0;
}
正确代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
vector<set<int> >a;
int num[N];
int main()
{
cin>>n;
int k,x,y;
while(n--)
{
cin>>k;
set<int> tmp;
while(k--)
{
cin>>x;
tmp.insert(x);
}
a.push_back(tmp);
}
cin>>n;
while(n--)
{
cin>>x>>y;
vector<int> res(4000);
auto itt=set_intersection(a[x-1].begin(),a[x-1].end(),a[y-1].begin(),a[y-1].end(),res.begin() );
int i=itt-res.begin();
itt=set_union(a[x-1].begin(),a[x-1].end(),a[y-1].begin(),a[y-1].end(),res.begin() );
int j=itt-res.begin();
printf("%.2f%\n",100.0*i/j);
}
return 0;
}
链表去重
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int co[N],del[N];
struct node{
int d;
int w;
int ne;
}l[N];
queue<int> q;
int c=0,dl=0;
int f[N];
int hea,n;
int main()
{
cin>>hea>>n;
for(int i=1;i<=n;i++)
{
int u,v,j;
cin>>u>>v>>j;
l[u].d=u;
l[u].w=v;
l[u].ne=j;
}
q.push(hea);
int cnt=0;
while(!q.empty())
{
int d=q.front();
q.pop();
int j=abs(l[d].w);
if(f[j]==0)
{
f[j]=1;
co[c]=d;
c++;
}
else
{
del[dl]=d;
dl++;
}
int y=l[d].ne;
if(y!=-1) q.push(y);
}
for(int i=0;i<c;i++)
{
int j=co[i];
int ne=co[i+1];
if(i!=c-1)
{
printf("%05d %d %05d\n",l[j].d,l[j].w,ne);
}
else
{
printf("%05d %d %d\n",l[j].d,l[j].w,-1);
}
}
for(int i=0;i<dl;i++)
{
int j=del[i];
int ne=del[i+1];
if(i!=dl-1)
{
printf("%05d %d %05d\n",l[j].d,l[j].w,ne);
}
else
{
printf("%05d %d %d\n",l[j].d,l[j].w,-1);
}
}
return 0;
}
那就别担心了
原题
简单dfs
#include<bits/stdc++.h>
using namespace std;
const int N=550;
//>=2条路径可以到达,最长路径是否通过
vector<int> a[N];
int flag=1;
int cnt[N];
queue<int >q;
int n,m;
int dfs(int x,int y)
{
if(cnt[x]==0)
for(int t:a[x]) cnt[x] += dfs(t,y);
if(cnt[x]==0) flag=0;
return cnt[x];
}
int main()
{
cin>>n>>m;
int x,y;
for(int i=0;i<m;i++)
{
cin>>x>>y;
a[x].push_back(y);
}
cin>>x>>y;
cnt[y]=1;
int res=dfs(x,y);
if(flag) cout<<res<<" Yes";
else cout<<res<<" No";
return 0;
}
总结
继续加油!!下次要再细心一些,对于学过的算法别忘记了,再熟悉一些,还要额外再去看看STL知识,对于很多很方便的STL应用还是不太熟悉了解。