T1移山填海
典型的遍历填充算法!我们考虑搜索到一个区间,就开始填充操作!这里面需要开一个数组存下你的耗费,最后sort后输出即可!
考察 bfs/dfs+排序!
dfs遍历部分
void dfs(int x,int y ){ vis[x][y]=1; if(mp[x][y]>0) s+=mp[x][y]*2; else s-=mp[x][y]; for(int i=0;i<4;i++){ int tx=x+nx[i],ty=y+ny[i]; if(tx<1||ty<1||tx>n||ty>m||vis[tx][ty]||mp[tx][ty]==0) continue; dfs(tx,ty); } return; }
主函数部分
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(mp[i][j]!=0 && !vis[i][j]){ s=0; dfs(i,j); mj[++cnt]=s; }
最后sort输出即可!!
T3 砍树
因为是45度,所以树最后的高度,就是a[i]-a[i-1]的距离,同理右边看过来也是这样的,所以我们左边处理一遍,右边处理一遍即可
考察排序+分步骤处理问题
时间复杂度最大的是由sort提供的,也就是n(logn)
给出的代码是中间一起处理的,两头额外处理,左边处理一遍右边处理一遍,代码上可能更简单
sort(a+1,a+n+1,cmp); if(a[2].a-a[1].a<a[1].b) ans+=a[1].b-a[2].a+a[1].a; int minx; for(int i=2;i<n;i++) { minx=min(a[i].a-a[i-1].a,a[i+1].a-a[i].a); if(a[i].b>minx) ans+=a[i].b-minx; } if(a[n].a-a[n-1].a<a[n].b) ans+=a[n].b-a[n].a+a[n-1].a;
T4 消灭扫雷团伙
裸的并查集,并查集做完以后,利用桶把每个团伙给统计一下!代码就不给出了
T5 强壮网络
处理之前,先把费用重新计算一下,然后放入结构体数组,接下来就是最小生成树了!
下面给出的处理价值的代码,价值处理完,那就是并查集了!
for(int i=1; i<=m; i++) { int val,op; G[i].u=read(); G[i].v=read(); val=read(); op=read(); if(op) G[i].w=(val+1)/2; else G[i].w=val*2; }
T6和谐数
利用bfs拓展数字,和电梯一题差不多!注意特判防止越界
for(int i=1;i<=9;i++) q.push(i); int cnt=0; while(!q.empty()){ long long p1=q.front(); q.pop(); cnt++; if(cnt==n){ cout<<p1; break; } for(int i=-1;i<=1;i++){ long long p2=p1%10+i; if(p2>=0&&p2<=9){ q.push(p1*10+p2); } } }