zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    在Linux终端命令行下播放音乐的命令
    危险,几条可致命的Linux命令!
    Linux 之 shell 比较运算符
    Linux-dd命令详解
    vi总结的几个技巧
    用iptables实现代理上网
    CentOS7.5 开启Samba服务
    CentOS7.5常用命令
    CentOS7.5 安装部署Apache+Mysql+Php
    C++入门基础笔记
  • 原文地址:https://www.cnblogs.com/kirai/p/6091332.html
Copyright © 2011-2022 走看看