题解 | 牛客周赛 Round 1

周赛全部题解

A.游游画U

对于画图形问题我们一定要找到图形的具体的变化所在,比如这题我们能够发现是由不变化的上半部分和变化的下半部分组合而来的,我们考虑下半部分的特点,最开始外围是一个点一直到n个点的处理方式,所以按照这个要求来构造就好了

char dt[M][M];
char s[N];
void solve()
{
    cin>>n;
    for(int i=1;i<=3*n;i++)
    {
      for(int j=1;j<=n;j++) cout<<'*';
      for(int j=1;j<=2*n;j++) cout<<'.';
      for(int j=1;j<=n;j++) cout<<'*';   
      cout<<endl;
    }//上半部分
    
    for(int i=1;i<=n;i++)
    {
        string s;
        for(int j=1;j<=i;j++) s+='.';
        for(int j=1;j<=n;j++) s+='*';
        for(int j=1;j<=n-i;j++) s+='.';
        cout<<s;
        reverse(s.begin(),s.end());
        cout<<s;
        cout<<endl;
    }// 下半部分
    return ;
}

b.游游的数组染色

对于这种题我们发现他是对于一个个相同的数的不同颜色进行处理,那么我们就可以固定一个数的然后用两种颜色来乘积计算就好了,我们不妨使用mp来处理,我们把两个颜色变为0,1这样便于我们来处理这个问题

map<PII,int> mp;
int a[N],b[N];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) 
    {
        char s; cin>>s;
        if(s=='B') mp[{1,a[i]}]++;
        else mp[{0,a[i]}]++;// 同一个数的不同属性确定了一个数
    }
    int res=0;
    for(auto &[P,cnt]:mp){
        auto [s,x]=P;
       res+=mp[{1-s,x}]*mp[{s,x}];// 这个时候取出来这个数的两个属性
    }
    res/=2;// 由于不考虑顺序
    cout<<res<<endl;
    return ;
}

C.游游的交换字符

不妨考虑这么一个问题不论怎么排列最后要么是1在第一位要么是0在第一位一,所以我们就这两种情况来取一个最优解,对于一开始固定1是第一个位置那么下一个1一定是第三个位置,当下一个一不是在目标位置的时候我们需要的是最靠前的目标位置-当前位置也就是需要和相邻的0交换这么多次,当然1的数量比0多那么1一定是从奇数位置开始的

void solve()
{
    string s; cin>>s;
    n=s.size();
    s=' '+s;
    int res1=0,res2=0,res;
    int cnt1=1,cnt2=2,cnt=0;
    // 表示1放在第一位和第二位的答案
    for(int i=1;i<=n;i++){
        if(s[i]=='1')
        {
            res1+=abs(cnt1-i);
            res2+=abs(cnt2-i);
            cnt1+=2,cnt2+=2;
            cnt++;
        }
    }
    if(cnt*2==n) res=min(res1,res2);
    else if(cnt*2>n) res=res1;
    else res=res2;
    cout<<res<<endl;
    return ;
}

D.游游的9的倍数

这是子序列问题也就是我当前这个点可以由我们前面的所有点转移而来,但是我们发现前面的点的状态只有9种,所以我们考虑状态机dp,定义当前位置为i的方案数由多少,那么我们当前的状态只能由前面的满足9种状态转移而来,所以就是一个dp即可,这种方法一般是在状态很少的情况下对于状态数做n^2的处理

int dp[15],d[15];
void solve()
{
    string s; cin>>s;
    n=s.size(); s=' '+s;
    
    dp[0]=1;
    for(int i=1;i<=n;i++){
        int x=s[i]-'0';
        x%=9;
        memcpy(d,dp,sizeof dp);// 上一次的不会被这一次的影响
        for(int j=0;j<=8;j++){
            int y=(j+x)%9;// 与其他的方案组合
            dp[y]=(dp[y]+d[j])%mod;
        }
    }
    cout<<dp[0]-1<<endl;
    return ;
}
全部评论

相关推荐

已oc&nbsp;云智断更了好几天,也有一些话想说,继续更新一篇云智timeline&nbsp;4.18&nbsp;一面&nbsp;半个小时后约二面&nbsp;4.21二面&nbsp;当晚&nbsp;约hr面&nbsp;4.23hr面&nbsp;4.30&nbsp;发offer之前美团的二面挂了,进入人才库,后面又被捞起来面试,4.30号&nbsp;美团又一面,现在还没出一面结果感觉也不报什么希望,就算一面过了,还有二面,我经不起深入拷打,唉,真的,好难五一躺平了五天,吃吃玩玩睡睡~还要担心毕业,科研更是难,唉暑期可能就到此为止了,后面没有时间在这个上面了,要抓紧时间做科研,为了后面能出去实习。大厂,秋招再见!!!有一些感慨:4.1是我的第一次面试,美团,面试的时候紧张到浑身发...
daisy9542:我今晚也是美团一面,已经第六次了。我也面了其他的,没拿到 offer。但我想开了,要按照自己的节奏来,找暑期转正然后秋招大杀四方并不是唯一的出路,其实还有很多选择的,有 0 实习最后秋招拿 offer 了,也有不选择互联网去国企的外企的,考编的,创业的。现在的失败不代表以后的路都是黑暗的,只不过可能运气还没降临到头上。所以现在要做的,就是放平心态,提升自己,通过面试了解到自己的优点和不足,争取下次机会来了能好好抓住
点赞 评论 收藏
分享
饼子吃到撑:当我看到外企的时候,我就知道这大概率可能是真的
点赞 评论 收藏
分享
小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务