题目链接:http://codeforces.com/contest/353/problem/C
题意:给你一串数字a[]和一个二进制串,要求找一个不超过m的二进制数,使得与对应a[]上的数字的乘积和最大。输出最大的和。
贪心地找,先求出所有对应数字位都取到的时候的和为初始答案值,接下来从低到高统计a[]的前k项和,当二进制串的第k项为1的时候,我们把这一位的1变成0,这个时候就可以取比它低位的所有数字,并且也能取比它高位的对应原来的二进制串的数字了,这样更新出来就是答案。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 100100; 5 int a[maxn]; 6 int s[maxn]; 7 char m[maxn]; 8 int n, ret; 9 10 int main() { 11 // freopen("in", "r", stdin); 12 while(~scanf("%d", &n)) { 13 memset(s, 0, sizeof(s)); 14 for(int i = 0; i < n; i++) scanf("%d", &a[i]); 15 scanf("%s", m); 16 s[0] = (m[0] == '1') ? a[0] : 0; 17 for(int i = 1; i < n; i++) { 18 if(m[i] == '1') s[i] = s[i-1] + a[i]; 19 else s[i] = s[i-1]; 20 } 21 int sum = 0; 22 ret = s[n-1]; 23 for(int i = 0; i < n; i++) { 24 if(m[i] == '1') { 25 int tmp = s[n-1] - s[i]; 26 ret = max(ret, tmp+sum); 27 } 28 sum += a[i]; 29 } 30 printf("%d ", ret); 31 } 32 return 0; 33 }