快手2019校招笔试题

Posted 一米阳光213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快手2019校招笔试题相关的知识,希望对你有一定的参考价值。

目的:分别从前面和后面开始找划分点,使得前面的数字之和 = 后面的数字之和

目标表述:sum( 前面m 个数 ) = sum( 后面n个数) s.t. m+n <= N(总个数)

变形:sum[i] 表示前 i 个数之和,sum2[i]表示后 i 个数之和

如果 sum[m] == sum2[n] ,s.t., m+n <= N,问题解决!

#include <iostream>
using namespace std;
typedef long long lint;

lint a[200002] =0;
lint sum[200002] =0;
lint sum2[200002] =0;

// 在 sum2[] 中搜索是否有元素= q,因为 sum2 单调递增,所以可以用二分查找
// 搜索范围从 sum2[1] 到 sum2[limit]
// 返回值: 找到就返回序号,没找到就返回 -1
int bi_search(lint q, int limit)
    if( q < sum2[1] || q > sum2[limit] ) return -1;
    int left = 1, right = limit, mid;
    while( left <= right )
        mid = (left+right)/2;
        if( sum2[left] == q ) return left;
        if( sum2[right] == q ) return right;
        if( sum2[mid] == q ) return mid;
        if( mid == left) break;
        if( sum2[mid] > q )
            right = mid;
        else
            left = mid;

    
    return -1;


int main()

    int n;
    cin >> n;
    for(int i=1;i<=n;i++)   // 从1开始
    
        scanf("%lld",&a[i]);
        sum[i] = sum[i-1] + a[i];
    
    for(int i=n;i>=1;i--)
        sum2[n+1-i] = sum2[n-i] + a[i];

    /************ match ************/
    lint max_gain = 0;
    for(int i=1;i<n;i++)
        int j = n - i; // 取值的范围
        if( bi_search(sum[i],j) != -1 )
            max_gain = sum[i];
    
    cout << max_gain << endl;

    return 0;

以上是关于快手2019校招笔试题的主要内容,如果未能解决你的问题,请参考以下文章

网易2019校招笔试题-瞌睡

网易2019校招笔试题-瞌睡

百度2015校招笔试题(头巾问题)

微软2017校招笔试题2 composition

微软2017校招笔试题3 registration day

校招笔试题编程技巧总结