题意:二进制m,在m的二进制的形式中2上系数,确定一个数组的下标,定义f(x)=ai+aj+ak...,i,j,k是2上的系数。问在m的范围内确定x使得f(x)最大,输出最大的f(x)。注意:输入二进制从左到右一次增大,而并非计算机中从右到左增大。
按照此题分析:在二进制中第i个位置有1,那么前面都可以取1,不管0和1.即总有x<m;由于集合中元素大于零,取的最多就最大。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
int a[100005];
char b[100005];
int main()
{
int n;
__int64 Max,sum;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%s",b);
Max=0,sum=0;
for(int i=0;i<n;i++){
if(b[i]=='1') Max=max(Max+a[i],sum);
sum+=a[i];
}
printf("%I64d\n",Max);
}
return 0 ;
}