快手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校招笔试题的主要内容,如果未能解决你的问题,请参考以下文章