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

在线练习地址:
校招全国统一模拟笔试技术类编程题汇总: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

相关推荐

点赞 评论 收藏
转发
点赞 46 评论
分享
牛客网
牛客企业服务