![[CF353C]Find Maximum(贪心) [CF353C]Find Maximum(贪心)](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
题目链接:http://codeforces.com/contest/353/problem/C
题意:给你一串数字a[]和一个二进制串,要求找一个不超过m的二进制数,使得与对应a[]上的数字的乘积和最大。输出最大的和。
贪心地找,先求出所有对应数字位都取到的时候的和为初始答案值,接下来从低到高统计a[]的前k项和,当二进制串的第k项为1的时候,我们把这一位的1变成0,这个时候就可以取比它低位的所有数字,并且也能取比它高位的对应原来的二进制串的数字了,这样更新出来就是答案。
#include <bits/stdc++.h>
using namespace std; const int maxn = ;
int a[maxn];
int s[maxn];
char m[maxn];
int n, ret; int main() {
// freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
memset(s, , sizeof(s));
for(int i = ; i < n; i++) scanf("%d", &a[i]);
scanf("%s", m);
s[] = (m[] == '') ? a[] : ;
for(int i = ; i < n; i++) {
if(m[i] == '') s[i] = s[i-] + a[i];
else s[i] = s[i-];
}
int sum = ;
ret = s[n-];
for(int i = ; i < n; i++) {
if(m[i] == '') {
int tmp = s[n-] - s[i];
ret = max(ret, tmp+sum);
}
sum += a[i];
}
printf("%d\n", ret);
}
return ;
}