百度2016研发工程师在线编程题 - 题解

百度这套题还是有点水的,除了最后一题是个简单的动态规划,需要注意下细节。

题目链接:[点这儿].

第一题:罪犯转移

题目:

C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?

解析:

枚举就好了,先计算前c个数的和sum,往后计算的时候就只需要加上当前值,减去距离当前值为c的数就行了.

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

int main()
{
    int n, t, c;
    while (cin >> n >> t >> c) {
        vector<LL> arr(n);
        LL sum = 0;
        for (int i = 0; i < n; i++)
            cin >> arr[i], sum += i < c ? arr[i] : 0;
        int ans = sum <= t ? 1 : 0;
        for (int i = c; i < n; i++)
            sum = sum - arr[i - c] + arr[i], ans += sum <= t ? 1 : 0;
        cout << ans << endl;
    }
    return 0;
}

第二题:裁减网格纸

题目:

度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。

解析:

维护x,y的最大最小值就好了,最后取边长最大的边长,注意下数据范围就可以过了.

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int INF = 0x3f3f3f3f;

int main()
{
    int n;
    while (cin >> n) {
        int x, y;
        int minX = INF, minY = INF, maxX = -INF, maxY = -INF;
        for (int i = 0; i < n; i++) {
            cin >> x >> y;
            minX = min(minX, x);
            minY = min(minY, y);
            maxX = max(maxX, x);
            maxY = max(maxY, y);
        }
        LL l = max(0LL + maxX - minX, 0LL + maxY - minY);
        cout << l * l << endl;
    }
    return 0;
}

第三题:钓鱼比赛

题目:

ss请cc来家里钓鱼,鱼塘可划分为n*m的格子,每个格子有不同的概率钓上鱼,cc一直在坐标(x,y)的格子钓鱼,而ss每分钟随机钓一个格子。问t分钟后他们谁至少钓到一条鱼的概率大?为多少?

解析:

简单的概率计算题,首先算出ss在每分钟能钓到鱼的概率( ni=1mj=1arr[i]nm );

问的是t分钟后至少钓到一条鱼的概率,那么我们就反向计算出t分钟后没有钓到鱼的概率,由于每分钟钓没钓到鱼是独立事件,因此设钓到鱼的概率为 p ,那么t分钟后至少钓到一条鱼的概率为1(1p)t。注意浮点数比较大小的写法就行了.

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const double eps = 1e-9;

int main()
{
    int n, m, x, y, t;
    while (cin >> n >> m >> x >> y >> t) {
        vector<vector<double> > mp(n, vector<double>(m));
        double ss = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                cin >> mp[i][j], ss += mp[i][j];
        double cc = mp[x - 1][y - 1];
        ss /= (1.0 * n * m);
        if (fabs(ss - cc) < eps) {
            puts("equal");
            printf("%.2f\n", 1 - pow(1 - cc, 1.0 * t));
        } else if (ss - cc > eps) {
            puts("ss");
            printf("%.2f\n", 1 - pow(1 - ss, 1.0 * t));
        } else {
            puts("cc");
            printf("%.2f\n", 1 - pow(1 - cc, 1.0 * t));
        }
    }
    return 0;
}

第四题:蘑菇阵

解析、代码:[点这儿].

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值