• 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;
    }
  • 相关阅读:
    Go语言 函数return值的几种情况
    VSCode 常用快捷键 Mac
    Java异常处理
    Java面向对象《三》
    C++类模板
    C++函数模板
    盛最多水的容器
    实现 Trie (前缀树)
    排序链表
    类似某团app搜索城市界面中 点击右侧城市首字母,对应城市区域置顶的功能(uniapp)
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089011.html
Copyright © 2020-2023  润新知