网易2019校招笔试题-瞌睡
Posted 一米阳光213
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网易2019校招笔试题-瞌睡相关的知识,希望对你有一定的参考价值。
分析:由于小易清醒的时间是连续的,所以整个搜索空间为O(n),根本不需要贪心或者动态规划就能搞定。 小易这堂课获得的兴趣值分为两部分:本来就清醒时获得的兴趣值,被叫醒的k分钟获得的兴趣值。因为第一部分是固定的,所以当第二部分最大时,整体取最大值。
思路:第一部分的兴趣值为 fixed_gain,第二部分,如果在第i分钟叫醒小易,额外获得的兴趣值为gain[i],gain[i]和gain[i-1]的关系如下:
// 只有当 t[i-1] 为 0 时,才是由于叫醒他而额外获得的兴趣值。
if( i+k-1 <=n )
gain[i] = gain[i-1] - a[i-1]*(1-t[i-1]) + a[i+k-1]*(1-t[i+k-1]);
else
gain[i] = gain[i-1] - a[i-1]*(1-t[i-1]);
代码:(37ms)
// 分析:由于是连续的,遍历一次就OK
#include <iostream>
using namespace std;
int main()
int n,k; // n 个数,k表示清醒时间
int a[100002] =0; // 兴趣度
int t[100002] =0; // 是否清醒
int gain[10002] =0; // gain[i]:第 i 分钟叫醒小易,获得的收益
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int fixed_gain = 0; // 本来清醒时候的收益,这个是固定的
for(int i=1;i<=n;i++)
scanf("%d",&t[i]);
if( t[i] == 1 )
fixed_gain += a[i];
/************* 简单地遍历一次即可 **************/
for(int i=1;i<=n;i++)
if(i==1)
for(int j=i;j<=i+k-1 && j<=n; j++)
if( t[j] == 0 )
gain[i] += a[j];
else
if( i+k-1 <=n )
gain[i] = gain[i-1] - a[i-1]*(1-t[i-1]) + a[i+k-1]*(1-t[i+k-1]);
else
gain[i] = gain[i-1] - a[i-1]*(1-t[i-1]);
// 找最大的收益
int max_gain =0;
for(int i=1;i<=n-k+1 && i <=n;i++)
max_gain = max(max_gain, gain[i]);
cout << max_gain + fixed_gain <<endl;
return 0;
以上是关于网易2019校招笔试题-瞌睡的主要内容,如果未能解决你的问题,请参考以下文章