[CF353C]Find Maximum(贪心)

题目链接: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 }
原文地址:https://www.cnblogs.com/kirai/p/6091332.html