Find Maximum(Codeforces Round #205 (Div. 2))

题目链接:http://codeforces.com/contest/353/problem/C

题意:给你一个数字n,然后给你n个数,和一个n位的二进制的数。求从0到这个二进制数表示的十位数m之间,所有的十进制数变成的二进制数与数组中的元素进行乘积所组成的数字和的最大值。可能说的有点拗口。。。举例说明吧:5     17 0 10 2 1     11010 n为5,数组中的元素依次是17 0 10 2 1 ,二进制数是11010就是十进制中的11;从十进制0到11中找到一个数字,使得p[i]*i(位上的数字(0,1))得到的和最大。这个题找到的是5,10100,所以是1*17+0*0+1*10+0*2+0*1 = 27,最大。


思路:这题,其实,我们知道,尽可能的多的数是最好的,如果当前位是1的话,我们把这一位换成0下面的全是1,这样,循环,就一定能找到最大值了!

#include <bits/stdc++.h>
using namespace std;
int sum[100100], p[100100];
char str[100100];
int main()
{
	int ans = 0, i, n;
	int t = 0, f = 0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &p[i]);
	scanf("%s", str);
	sum[0] = p[0];
	for (i = 1; i < n; i++)
		sum[i] = sum[i - 1] + p[i];
	for (i = 0; i < n; i++)
	{
		if (str[i] == '1')
		{
			t += p[i];
			f = i;
		}
	}
	ans = t;
	t = 0;
	for (i = f; i > 0; i--)
	{
		if (str[i] == '1')
		{
			ans = max(ans, sum[i - 1] + t);
			t += p[i];
		}
	}
	printf("%d
", ans);
	return 0;
}
原文地址:https://www.cnblogs.com/shmilky/p/14089011.html