Codeforces #205 Div.2 Problem C - Find Maximum

来源:互联网 发布:网络人旗舰版注册 编辑:程序博客网 时间:2024/06/02 20:36

题目链接:Find Maximum

解题思路:他是给你N个数字(a0 ~ a(n -1))和一个二进制数字M,求在[0, M]之间所有数作为函数F(X)中的最大值是多少。其中F(X)是X的二进制形式下,如果第i为是1的话,就加上ai,取最后的和。

之前没做出来,一直以为用背包就行,但是总花费没法表示,今天看了一下别人写的。就是M的二进制形式,从高位到低位但凡遇到1就将这一位的1变为0,再将比他低的所有的位变为1,求和,之后再将这位变为1,继续后面的位,在这些之中寻找最大值。

#include<string>#include<iostream>#define MAX 100010using namespace std;int num[MAX], sum[MAX];int tot, n, ans;string s;int main(){int i, j, k;tot = ans = 0;cin >> n;for(i = 0; i < n; i++){cin >> num[i];}cin >> s;sum[0] = num[0];for(i = 1; i < n; i++){sum[i] = sum[i - 1] + num[i];}for(i = 0; i < n; i++){if(s[i] == '1'){ans += num[i];}}for(i = n - 1; i >= 0; i--){if(s[i] == '1'){ans = max(ans, tot + sum[i - 1]);tot += num[i];}}cout << ans << endl;return 0;}