cf C. Find Maximum

本文提供了一种解决CodeForces 353/C问题的方法,通过预处理数组的累积和,并利用这些信息来高效地确定修改特定元素后能达到的最大和。

http://codeforces.com/contest/353/problem/C

先预处理前i个数的和,然后找到第一个出现的1,然后变成0后的和与目前的和比较,如果大就更新。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 100010
 5 using namespace std;
 6 
 7 int n;
 8 int a[maxn];
 9 int sum[maxn];
10 char str[maxn];
11 int k;
12 
13 int main()
14 {
15     while(scanf("%d",&n)!=EOF)
16     {
17         memset(sum,0,sizeof(sum));
18         for(int i=1; i<=n; i++)
19         {
20             scanf("%d",&a[i]);
21             sum[i]=sum[i-1]+a[i];
22         }
23         scanf("%s",str);
24         int ans=0;
25         for(int i=0; i<=n-1; i++)
26         {
27             if(str[i]=='1')
28             {
29                 ans+=a[i+1];
30                 k=i;
31             }
32         }
33         int max1=ans;
34         int c=0;
35         for(int i=k; i>0; i--)
36         {
37             if(str[i]=='1')
38             {
39                 max1=max(max1,sum[i]+c);
40                 c+=a[i+1];
41             }
42         }
43         printf("%d\n",max1);
44     }
45     return 0;
46 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3931336.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值