校招全国统一模拟笔试技术类编程题参考题解(六月)

在线练习地址:
校招全国统一模拟笔试技术类编程题汇总:https://www.nowcoder.com/test/11086583/summary
-----------------------------------

牛牛偶像养成记

分析

题目给出了n次牛牛能够上台的起始时间和持续时间,那么,我们可以通过这两个时间求到每次表演的结束时间。要使得牛牛上台的次数越多,那么就只有让牛牛上一个节目的结束时间越早,能留出更多的时间来选择后面更多的上台机会。所以,我们只需要将牛牛所有节目的结束时间从小到大排序,每次取满足条件的结束时间最早的节目就行了。

时间复杂度分析

O(nlogn)

参考代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

struct node {
    int start, ed;
};
node a[maxn];
int n, m;

bool cmp(node x,node y) {
    if(x.ed != y.ed)
        return x.ed < y.ed;
    else
        return x.start < y.start;
}
int main() {
    cin >> n;
    for(int i = 0; i < n; i++) {
        cin >> a[i].start >> m;
        a[i].ed = a[i].start + m;
    }
    sort(a, a + n, cmp);
    int ans = 0, t = 0;
    for(int i = 0; i < n; i++) {
        if(t <= a[i].start) {
            ans++;
            t = a[i].ed;
        }
    }
    cout << ans << endl;
    return 0;
}

牛牛与妞妞

分析

牛牛和妞妞一共可以取得有52张牌,在题目给出6张牌后,还有46张牌可以取。我们就把这46张牌全部放进一个数组里面,然后跑两重循环,枚举牛牛和妞妞最后一张牌分别可以取到什么牌,总的枚举数是分母,分子即为牛牛比妞妞多的数量,相除即可。

时间复杂度

O(13^2)

参考代码

#include <bits/stdc++.h>

using namespace std;

int a1,b1,c1,a2,b2,c2;
int vis[15];
int a[60];

int main() {
    memset(vis,0,sizeof(vis));
    scanf("%d%d%d", &a1, &b1, &c1);
    vis[a1]++;
    vis[b1]++;
    vis[c1]++;
    scanf("%d%d%d", &a2, &b2, &c2);
    vis[a2]++;
    vis[b2]++;
    vis[c2]++;
    int sum1 = a1 + b1 + c1;
    int sum2 = a2 + b2 + c2;
    int cnt = 0;
    double l=0,r=0;
    for(int i=1;i<=13;i++)
    {
        for(int j=0;j<4-vis[i];j++)
        {
            a[cnt++]=i;
        }
    }
    for(int i=0;i<cnt;i++)
    {
        sum1+=a[i];
        for(int j=0;j<cnt;j++)
        {
            if(i == j)
                continue;
            sum2+=a[j];
            r++;
            if(sum1>sum2)
                l++;
            sum2-=a[j];
        }
        sum1-=a[i];
    }
    printf("%.4f\n",l/r);
    return 0;
}

牛牛数星星

分析

从数据规模可以看到,我们一共有10万颗星星以及最多10万次查询,如果我们每次查询都把给出的范围内遍历一遍的话肯定会超时。那么,我们就需要换一种方法。因为我们只需要得到一个矩形范围内的星星的数量,我们就可以先跑一遍整个数据范围,找到这个点的左上方向一共有多少颗星星,并把它标记出来。那么,我们要得到的矩形范围内的星星数量就变为了这个矩形右下角的点的值减去这个矩形左下角左边那个点的值再减去这个矩形右上角上面那个点的值再加上这个矩形左上角的左上边那个点的值(可以想象一下容斥定理)。那么,我们只需要遍历一次1000*1000的地图就行了,每个查询可以O(1)来获取。

时间复杂度

O(N^2)

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 5;

int n, m;
int num[maxn][maxn];
int mp[maxn][maxn];
int x, y;
int a1, b1, a2, b2;

int main() {
    memset(num, 0, sizeof(num));
    memset(mp, 0, sizeof(mp));
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d%d", &x, &y);
        mp[x][y]++;
    }
    for(int i = 1; i < maxn; i++) {
        for(int j = 1; j < maxn; j++) {
            num[i][j] = num[i - 1][j] + num[i][j - 1] + mp[i][j] - num[i - 1][j - 1];
        }
    }
    scanf("%d", &m);
    for(int i = 0; i < m; i++) {
        scanf("%d%d%d%d", &a1, &b1, &a2, &b2);
        printf("%d\n", num[a2][b2] - num[a1 - 1][b2] - num[a2][b1 - 1] + num[a1 - 1][b1 - 1]);
    }
    return 0;
}

牛牛与世界杯门票

分析

  这个题可以看做是一个完全背包,人的个数相当于背包的容量,票的价格相当于价值,dp[i]表示买到i张票时的最小花费为dp[i],最后dp[n]即为买到n张票时的最小花费(程序中的n是加上牛牛自己时的数量)。

时间复杂度

O(n*m)

参考代码

#include<bits/stdc++.h>  using namespace std;

const int maxn = 1e3 + 5;

int n,m,k,x,y;
int dp[maxn];

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    n++;
    for(int i=1; i<=n; i++)
        dp[i]=i*k;
    while(m--)
    {
        scanf("%d%d",&x,&y);
        for(int i=1; i<=n; i++)
        {
            if(i-y>=0)
                dp[i]=min(dp[i],dp[i-y]+x);
            else
                dp[i]=min(dp[i],x);
        }
    }
    printf("%d\n",dp[n]);
    return 0;
}

牛牛游玩记

分析

如果只有一个入口,那么这个题就是一个裸的BFS(DFS),但是改成多个入口之后呢?每一个都计算一次BFS(DFS)么?当然不。我们可以假象有一个超级起点,把这个起点连接上所有的入口,那么,这个题不就相当于一个入口一个出口了么。所以,我们只要把所有的起点在一开始都放入BFS的队列中,后面就按照普通的BFS写法就行了。

时间复杂度

O(n^2)

参考代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 5;

const int dx[] = {0, 1, 0, -1};
const int dy[] = {-1, 0, 1, 0};

struct node {
    int x, y;
};
int n, m;
int dis[maxn][maxn];
char mp[maxn][maxn];
node a, ed;
int main() {
    memset(mp, 0, sizeof(mp));
    memset(dis, -1, sizeof(dis));
    queue<node> q;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++) {
        scanf("%s", mp[i]);
    }
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(mp[i][j] == '@') {
                a.x = i;
                a.y = j;
                q.push(a);
                dis[i][j] = 0;
            }
            if(mp[i][j] == '*') {
                ed.x = i;
                ed.y = j;
            }
        }
    }
    while(q.size()) {
        node p = q.front();
        q.pop();
        for(int i = 0; i < 4; i++) {
            int px = p.x + dx[i];
            int py = p.y + dy[i];
            if(dis[px][py] == -1 && px >= 0 && px < n && py >= 0 && py < n && mp[px][py] != '#') {
                node pp;
                pp.x = px;
                pp.y = py;
                q.push(pp);
                dis[px][py] = dis[p.x][p.y] + 1;
                if(px == ed.x && py == ed.y)
                    break;
            }
        }
        if(dis[ed.x][ed.y] != -1) break;       
    }
    printf("%d\n", dis[ed.x][ed.y]);
    return 0;
}

-----------------------------
模拟笔试7月场报名https://www.nowcoder.com/mockexam/MockExam
全部评论
我想请问一下,牛牛与世界杯的测试用例是不是有问题,下面这组测试用例,有一个套餐为 22块买69张门票,显然,44块可以买138张门票,大于等于117张门票,比对应输出472要小。对应输出给出的就不是正确答案。 您的代码已保存 答案错误:您提交的程序没有通过所有的测试用例 case通过率为80.00% 测试用例: 116 26 450 230 15 531 70 777 63 589 61 266 81 322 77 517 73 820 68 241 77 103 42 256 91 750 87 866 51 569 97 524 83 173 2 22 69 653 14 846 17 896 69 111 90 194 68 326 2 335 18 175 79 933 55 对应输出应该为: 472 你的输出为: 44
点赞
送花
回复
分享
发布于 2018-06-23 11:03
对于牛牛与世界杯门票这道题,我也有与4楼同样的怀疑,是不是数据给错了。 对于牛牛与妞妞这道题,我质疑一下解题思路。 由于已经取出6张扑克牌,那么从1-K肯定存在不是4的牌,也就是说取每个数值的概率是不相等的,这个概率这么求是有问题的吧。 我觉得思路应该是总的情况为46*45,然后遍历13*13,判断每张牌剩下的个数,然后对符合的情况做剩余牌数的乘积,最后加和。概率就是求得的和除以总的情况,对于3 5 7      2 6 8这组数据,我的输出是0.3995,而标程给的是0.3905
点赞
送花
回复
分享
发布于 2018-06-23 14:52
秋招专场
校招火热招聘中
官网直投
我就想知道考试的时候官方有没有用参考代码跑一跑看看能不能过。 牛牛数星星 这题数据我表示觉得是有问题的。 官方这样子的代码,笔试的时候大概只能得50%的分数。为什么我知道呢?因为在WA了10多发之前我的代码也差不多是这样子的。直到我加了这两句话: if(a2>1000) a2 = 1000; if(b2>1000) b2 = 1000;
点赞
送花
回复
分享
发布于 2018-06-23 17:26
为果姐打call!
点赞
送花
回复
分享
发布于 2018-06-22 17:30
给果姐打电话
点赞
送花
回复
分享
发布于 2018-06-22 17:51
GG
点赞
送花
回复
分享
发布于 2018-06-22 17:40
为啥没有其他类型考试的题解啊
点赞
送花
回复
分享
发布于 2018-06-26 07:44
牛牛游玩记这一题,同一个节点相对于不同的起点,dis[px][py]是不是不同呢?如果从一个起点访问过某一节点后,这个节点的dis[px][py] 不再是 -1,从其他起点是不是就不能访问了?
点赞
送花
回复
分享
发布于 2018-06-26 20:11
同问,为啥没有其它类型的考试题解。。。
点赞
送花
回复
分享
发布于 2018-07-03 18:43
牛牛数星星这道题: 为什么考试的时候是部分正确的代码,,现在提交是完全正确?
点赞
送花
回复
分享
发布于 2018-07-16 20:25

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 46 评论
分享
牛客网
牛客企业服务