牛客网2018年全国多校算法寒假训练营练习比赛(第四场)

Yuhuger Yuhuger     2022-10-15     476

关键词:

T1 石油采集

这题可以建一张二分图跑最大匹配,也可以直接染色然后数数

技术分享图片
#include<bits/stdc++.h>
using namespace std;
char s[60][60];
int c0,c1,n;
void dfs(int x,int y){
    if (x>=n||y>=n||x<0||y<0||s[x][y]==.) return;
    (x+y)&1?++c0:++c1;
    s[x][y]=.;
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x,y+1);
    dfs(x,y-1);
}
int main(){
    int t;
    scanf("%d",&t);
    for (int i=1; i<=t; ++i){
        scanf("%d",&n);
        int ans=0;
        for (int i=0; i<n; ++i) scanf("%s",s[i]);
        for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
        if (s[i][j]==#){
            c0=0; c1=0;
            dfs(i,j);
            ans+=min(c0,c1);
        }
        printf("Case %d: %d
",i,ans);
    }
}
View Code

T2 道路建设

这题是一道裸的最小生成树

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=10010;
int fa[N];
pair<int,pair<int,int> > e[M];
int find(int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
    int c,n,m; scanf("%d%d%d",&c,&m,&n);
    for (int i=1; i<=m; ++i) scanf("%d%d%d",&e[i].second.first,&e[i].second.second,&e[i].first);
    sort(e+1,e+m+1);
    for (int i=1; i<=n; ++i) fa[i]=i;
    long long ans=0;
    for (int i=1; i<=m; ++i){
        int x=e[i].second.first,y=e[i].second.second,z=e[i].first;
        x=find(x);
        y=find(y);
        if (x==y) continue;
        fa[x]=y;
        ans+=z;
    }
    printf(ans<=c?"Yes":"No");
}
/*
20 10 5
1 2 6
1 3 3
1 4 4
1 5 5
2 3 7
2 4 7
2 5 8
3 4 6
3 5 9
4 5 2*/
View Code

T3 求交集

这题只需要扫一下即可(输出格式巨坑无比)

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N],b[N];
int main(){
    int n,m;
    vector<int> ans;
    scanf("%d%d",&n,&m);
    for (int i=1; i<=n; ++i) scanf("%d",&a[i]);
    for (int j=1; j<=m; ++j) scanf("%d",&b[j]);
    int j=1;
    for (int i=1; i<=n; ++i){
        for (; j<=m&&b[j]<a[i]; ++j);
        if (b[j]==a[i]) ans.push_back(b[j]),++j;
    }
    if (ans.size()){
        for (int i=0; i<(int)ans.size()-1; ++i) printf("%d ",ans[i]); printf("%d",ans.back());
    }else printf("empty");
}
View Code

T4 小明的挖矿之旅

这题相对来说比较复杂

我的做法是从没有dfs过的最左上的点开始dfs,数dfs到的有几个点下边和右边都是“#”,这题有一个特判很容易漏,就是如果只有一个“.”,就不需要传送门。

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=1010; 
int ans,n,m,tot;
char mp[N][M];
bool dfs(int x,int y){
    if (x<=0||y<=0||x>n||y>m||mp[x][y]==#) return 1;
//    cerr<<x<<" "<<y<<" "<<ans<<endl;
    if (mp[x][y]==_) return 0;
    mp[x][y]=_;
    ans+=dfs(x+1,y)&dfs(x,y+1);
    return 0;
}
int main(){
    cin>>n>>m;
    for (int i=1; i<=n; ++i)
    for (int j=1; j<=m; ++j)
    cin>>mp[i][j];
    for (int i=1; i<=n; ++i)
    for (int j=1; j<=m; ++j)
    if (mp[i][j]!=#){
        if (mp[i][j]==.) dfs(i,j);
        ++tot;
    }
    if (tot==1) ans=0;
    cout<<ans;
}
View Code

T5 通知小弟

这题我的做法好像复杂了,有可能是我想多了

先缩点成一张DAG,再考虑是否所有入度为0的新点都至少包含一个HA可联系的点,如果不是,就输出-1

否则答案就是入度为0的新点个数

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=250010;
stack<int> s;
int nscc,n,m,isc[N],pre[N],low[N],b[M],fi[N],ne[M],k,clk,a[N],rd[N];
void tajan(int x){
    s.push(x);
    low[x]=pre[x]=++clk; 
    for (int j=fi[x]; j; j=ne[j]){
        if (!pre[b[j]]) tajan(b[j]);
        if (!isc[b[j]]) low[x]=min(low[x],low[b[j]]);
    }
    if (pre[x]==low[x]){
        ++nscc;
        while (1){
            int u=s.top(); s.pop();
            isc[u]=nscc;
            if (u==x) break;
        }
    }
}
inline void add(int x,int y){ 
//    cerr<<"add:"<<x<<" "<<y<<endl; 
    b[++k]=y; ne[k]=fi[x]; fi[x]=k;
}
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>m;
    for (int i=1; i<=m; ++i) cin>>a[i];
    for (int i=1; i<=n; ++i){
        int x,y; cin>>x;
        while (x--){
            cin>>y;
            add(i,y);
        }
    }
    for (int i=1; i<=n; ++i) if (!pre[i]) tajan(i);
    for (int i=1; i<=n; ++i)
    for (int j=fi[i]; j; j=ne[j])
    if (isc[i]!=isc[b[j]]) ++rd[isc[b[j]]];
    for (int i=1; i<=m; ++i) if (rd[isc[a[i]]]==0) rd[isc[a[i]]]=-1;
    for (int i=1; i<=nscc; ++i) if (rd[i]==0) return cout<<-1,0;
    int ans=0;
    for (int i=1; i<=nscc; ++i) if (rd[i]==-1) ++ans;
    cout<<ans; 
}
View Code

T6 Call to your teacher

这题是一道dfs裸题

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=51;
int n,m;
bool b[N];
vector<int> e[N];
void dfs(int x){
    b[x]=1;
    for (vector<int>::iterator i=e[x].begin(); i!=e[x].end(); ++i)
    if (!b[*i]) dfs(*i); 
}
int main(){
    cin>>n>>m;
    while (m--){
        int x,y; cin>>x>>y;
        e[x].push_back(y);
    }
    dfs(1);
    cout<<(b[n]?"Yes":"No");
}
View Code

T7 老子的意大利炮呢

这题先从李云龙所在的终点bfs,处理出每个点据他的距离(不能经过墙)

再暴力枚举三个零件点到达的顺序,算出答案

答案取min。

技术分享图片
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pa;
const int N=110,C=10;
int dis[N][N];
char mp[N][N];
int n,m,be,px[C],py[C],pz[C],p[C];
inline int di(int x1,int y1,int x2,int y2){
    return abs(x1-x2)+abs(y1-y2);
}
void bfs(pa x){
    queue<pa> q;
    q.push(x);
    while (!q.empty()){
        int a=q.front().first,b=q.front().second; q.pop();
        mp[a][b]=#;
        if (a+1<=n&&mp[a+1][b]==.){
            dis[a+1][b]=dis[a][b]+1;
            q.push(pa(a+1,b));
        }
        if (a-1>=1&&mp[a-1][b]==.){
            dis[a-1][b]=dis[a][b]+1;
            q.push(pa(a-1,b));
        }
        if (b+1<=m&&mp[a][b+1]==.){
            dis[a][b+1]=dis[a][b]+1;
            q.push(pa(a,b+1));
        }
        if (b-1>=1&&mp[a][b-1]==.){
            dis[a][b-1]=dis[a][b]+1;
            q.push(pa(a,b-1));
        }
    }
}
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
    cin>>n>>m;
    for (int i=1; i<=n; ++i) cin>>(mp[i]+1);
    for (int i=0; i<5; ++i) cin>>px[i]>>py[i];
    for (int i=1; i<=3; ++i) cin>>pz[i];
    for (int i=1; i<=n; ++i)
    memset(dis,0x3f,sizeof(dis));
    dis[px[4]][py[4]]=0; bfs(pa(px[4],py[4]));
    long long ans=1e18;
    for (int i=0; i<3; ++i) p[i]=i+1;
    do{
        long long pp=di(px[0],py[0],px[p[0]],py[p[0]]);
        int g=pz[p[0]]+1;
    //    cerr<<pp<<" "<<g<<endl;
        pp+=di(px[p[0]],py[p[0]],px[p[1]],py[p[1]])*g,g+=pz[p[1]];
    //    cerr<<pp<<" "<<g<<endl;
        pp+=di(px[p[1]],py[p[1]],px[p[2]],py[p[2]])*g,g+=pz[p[2]];
    //    cerr<<pp<<" "<<g<<endl;
        pp+=1ll*dis[px[p[2]]][py[p[2]]]*g;
        ans=min(ans,pp);
    }while (next_permutation(p,p+3));
    cout<<ans;
}
View Code

T8 老子的全排列呢

这题直接next_permutation即可(输出格式坑人)

技术分享图片
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[10];
    for (int i=1; i<=8; i++) a[i]=i;
    do{
        for (int i=1; i<=7; i++) printf("%d ",a[i]); printf("%d",a[8]); puts("");
    }while (next_permutation(a+1,a+9));
}
View Code

牛客网_2018年全国多校算法寒假训练营练习比赛(第一场)_部分题解

~__~花了大半个小时水了点题,将究看看。  比赛首页 > A  大吉大利,今晚吃鸡——枪械篇 > 21035827在绝地求生(吃鸡)游戏里,不同的枪支有不同的威力,更是可以搭配不同的配件,以提升枪支... 查看详情

2018年全国多校算法寒假训练营练习比赛(第二场)

A题:链接:https://www.nowcoder.com/acm/contest/74/A来源:牛客网小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。(是的你没看错,小气泡... 查看详情

2018年全国多校算法寒假训练营练习比赛(第一场)g.圆圈

链接:https://www.nowcoder.com/acm/contest/67/G来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32768K,其他语言65536K64bitIOFormat:%lld题目描述    圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆... 查看详情

牛客网nowcoder2018年全国多校算法寒假训练营练习比赛(第五场)a.逆序数b.bigwaterproblem(线段树-区间查询求和和单点更新)f.thebiggestwater(代码片段)

随便补了几道题,可能也就能写出来这几道吧。最近被搜索虐爆了,要抓紧去看搜索,随便写写就溜,备忘一下线段树新的板子(以前的不好用,太垃圾了) A.逆序数时间限制:C/C++2秒,其他语言4秒空间限制:C/C++131072K,其他... 查看详情

2018年全国多校算法寒假训练营练习比赛(第三场)小牛再战(博弈)

链接:https://www.nowcoder.net/acm/contest/75/F来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32768K,其他语言65536K64bitIOFormat:%lld题目描述共有N堆石子,已知每堆中石子的数量,两个人轮流取石子,每次只能选择N堆石子中... 查看详情

牛客网nowcoder2018年全国多校算法寒假训练营练习比赛(第四场)a.石油采集(dfs)b.道路建设(最小生成树prim)c.求交集(暴力)f.calltoyourteacher

菜哭了。。。    A.石油采集时间限制:C/C++1秒,其他语言2秒空间限制:C/C++32768K,其他语言65536K64bitIOFormat:%lld链接:https://www.nowcoder.com/acm/contest/76/A来源:牛客网题目描述随着海上运输石油泄漏的问题,一个新的... 查看详情

2018年全国多校算法寒假训练营练习比赛(第二场)f-德玛西亚万岁

链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网题目描述德玛西亚是一个实力雄厚、奉公守法的国家,有着功勋卓著的光荣军史。这里非常重视正义、荣耀、职责的意识形态,这里的人民为此感到强烈自豪。有一天他们想去... 查看详情

2018年全国多校算法寒假训练营练习比赛(第二场)b-taotao要吃鸡

链接:https://www.nowcoder.com/acm/contest/74/B来源:牛客网题目描述Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了,和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包之后可以多携带h(h为0代表没... 查看详情

斯特林公式-stirling公式(取n阶乘近似值)-hdu1018-bignumber牛客网nowcoder2018年全国多校算法寒假训练营练习比赛(第三场)a.不凡的夫夫

最近一堆题目要补,一直咸鱼,补了一堆水题都没必要写题解。备忘一下这个公式。 Stirling公式的意义在于:当n足够大时,n!计算起来十分困难,虽然有很多关于n!的等式,但并不能很好地对阶乘结果进行估计,尤其是n很大... 查看详情

2018年全国多校算法寒假训练营练习比赛(第四场)

A: 石油采集刚开始题目读错了,乱交了4发,然后终于读对题目,想用匈牙利算法跑2分匹配,但是比赛的时候不会跑,赛后学了一下,补了一下1#include<bits/stdc++.h>2usingnamespacestd;3constintN=55*55;4stringstr[55];5intcnt=0,tot,n;6intdx[4]=... 查看详情

2018年全国多校算法寒假训练营练习比赛(第二场)

A用栈模拟,注意最后要换行。(这里wrong了好久...)1//A2#include<bits/stdc++.h>3usingnamespacestd;45#definePIacos(-1.0)6#defineINF1e187#defineinf0x3f3f3f3f8#defineFAST_IOios::sync_with_stdio(false)910typedeflonglongL 查看详情

2018年全国多校算法寒假训练营练习比赛(第五场)题解

 【题目链接】 A-逆序数经典问题,有很多方法,例如树状数组,线段树,归并排序等。代码不贴了。 B- BigWaterProblem单点修改求区间和,树状数组或者线段树都可以。#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e... 查看详情

2018年全国多校算法寒假训练营练习比赛(第三场)题解

 【题目连接】 由于在比赛期间发现了很多是原题,所以直接抄了原题代码,稍后准备重写。 A-不凡的夫夫答案为$leftlfloor{sumlimits_{i=1}^n{{{log}_8}i}} ight floor +1$,由于数据范围的问题,可以将询问离线,然后$1$到$10^7... 查看详情

2018年全国多校算法寒假训练营练习比赛(第五场):a题:逆序数(代码片段)

题目描述在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个序列为45132,那么这个序列的逆序数为7,逆序对... 查看详情

2018年全国多校算法寒假训练营练习比赛(第四场)题解

 【题目链接】 A-石油采集题意:有一个$01$矩阵,每次可以拿走两个相邻的$1$,问最多能操作几次。这题和HDU1507一样。二维矩阵四连通图是一个二分图,题目的操作事实上就是求这个二分图的最大匹配。 B-道路建设最... 查看详情

2018年全国多校算法寒假训练营练习比赛(第一场)g圆圈

思路:分形。记录中间左边点的坐标,然后推出另外3个点的坐标,递归到最简单的情况。代码:#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definepbpush_back#definemem(a,b)memset(a,b,sizeof(a))charc[2200][2200];voiddfs(intn,inti,int 查看详情

2018年全国多校算法寒假训练营练习比赛(第四场)

上一场自己状态爆表;这一场队友爆表,自己捡表了;题目呢,总的来说不难,相比于前面几场比赛来说,关键在于如何建图。像D题,在我的上一个博客里面就是一道同理的题,只需要求入度为0和出度为0的点最大数,然后特判... 查看详情

2018年全国多校算法寒假训练营练习比赛(第一场)c六子冲

思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definepbpush_back#definemem(a,b)memset(a,b,sizeof(a))intdir[4][2]={-1,0,1,0,0,-1,0,1};intmp[5][5];intbelong[15];intinx,iny;boo 查看详情