2018深信服秋招C++笔试题

1.有N个木板,问能容下多少水

比如下面的木板长度就是2,1,3,可以容下4单位水

    |
|- -|
|-|-|

思路:用一个前缀数组,一个后缀数组记录分别当前位置左右最高的木板,那么这两者取最小值就是当前位置能容下的水了

#include 
using namespace std;

const int maxn = 1e5 + 5;
int a[maxn];
int pre[maxn], post[maxn];

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        for(size_t i = 1; i <= n; i++)
        {
            scanf("%d", a + i);
        }
        a[0] = 0, a[n + 1] = 0;
        memset(pre, 0, sizeof(0));
        memset(post, 0, sizeof(post));
        for(size_t i = 1; i <= n; i++)
            pre[i] = max(pre[i - 1], a[i]);
        for(size_t i = n; i >=1 ; i--)
            post[i] = max(post[i + 1], a[i]);
        int ans = 0;
        for (int i = 1; i <= n;i++)
        {
            int tmp = min(pre[i - 1], post[i]);
            ans += tmp;
        }
        printf("%d\n", ans);
    }
    //system("pause");
    return 0;
}

2.深信服的采购阿姨买菜。。。
a 1 x + b 1 y = v 1 a 2 x + b 2 y = v 2 a_1x+b_1y=v1 \\ a_2x+b_2y=v2 a1x+b1y=v1a2x+b2y=v2
求x和y的唯一正整数解。。。搞了好久还是50%没过

3.N个数求某个子序列,使得这个子序列的和最小

就是最大字段和的翻版嘛。。。题目说的比较绕,其实很简单

#include 
using namespace std;

int main()
{
    int n;
    int a = 0, ans = 0,res=0;
    
    for(size_t i = 0; i < n; i++)
    {
        scanf("%d", &a);
        if(i==0)
            ans = a,res=a;
        else
            ans = min(ans + a, a);
        res = min(ans, res);
    }
    printf("%d\n", res);
    //system("pause");
    return 0;
}

4.深信服要搞招聘会,n个人应聘m种岗位,每种岗位需要k个人,现在给出第i个人在第j种岗位的能力为a[i][j],问最佳分配能获得的能力最大值

不会做,求大佬解答

你可能感兴趣的:(总结,C++)