#P114514. 国会山的陷落
国会山的陷落
背景
川普来了!米利坚太平了!川普来了!青天就有了!某年某月某六号,一个神奇的团体苦米利坚久矣,准备进京勤王,清君侧。国会里的佩洛东慌了,她赶紧逃命,走之前要求小L尽最大努力保住她电脑里的机密文件,就匆匆逃离了现场。可她不知道的是,小L其实是懂王的心腹,是安插在皿煮党身边的一个卧底,并且小L早就知道了佩洛东电脑机密文件的密码的破解方法,为了偷出机密文件,并让更少的人知道此事,以便小L继续潜伏,虽然是一伙的,但小L不能让神奇组织发现小L的事,所以小L时间不多了!于是他打电话向身为计算机高手的你求助,希望你能写出程序,帮助他快速破解密码。
题目描述
密码是一排数字,而随机个数数字上有着黄色的高亮,已知解开密码的方法是:高亮的数字之和在可操作条件下最大,这个最大的数就是密码。小L只能进行将高亮往左滑动一格的操作,一个高亮数字只能移动一次,但是可以移动多个高亮数字,但肉眼观察显然太慢了,所以需要你直接告诉他,可得到的最大数字。
你可能会用到
前缀和:顾名思义,是要求前缀的总和,什么是前缀,对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和,类似于等差数列中利用等差数列的和来求某一段子数列的和,对于一个前缀和处理过的数组:
求原数组第i个数字通过公式:x=a[i]-a[i-1];
求原数组第i到第j个数字的和通过公式:x=a[j]-a[i-1];
(此处的a[]数组,代表前缀和处理过的数组)
前缀和处理代码
for (int i = 1; i <= n; i ++ ){
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
输入描述
第一行一个整数t,代表有t组输入()
对于每一组数据,第一行一个整数n,代表一排中有n个数字()
第二行输入一串有n个字符的字符串,字符串由'0'和'1'构成,如果第i个字符是'1',则代表第i个数字是被选中的高亮状态,如果第i个字符是'0',则代表第i个数字未被选中(第i个数字指藏有密码信息的那一串数字的第i个)
第三行有一串数字a1,a2,a3,...,an,代表藏有密码信息的一排数字()
输出描述
对于每一组数据,输出一个密码
Samples
4
5
01110
10 5 8 9 6
6
011011
20 10 9 30 20 19
4
0000
100 100 100 100
4
0111
5 4 5 1
27
80
0
14
样例解释
第一组数据
5
01110
10 5 8 9 6
可以将第一个1往前移动一个这样高亮数字就变成了 10110
,这时候计算所有高亮数字和则为10+8+9=27
第二组数据
5
011011
20 10 9 30 20 19
将前两个1都往前移动一格,再将后两个1都往前移动一格,这样高亮数字就变成了110110
,这时候对所有高亮数字求和则为20+10+30+20=80
Limitation
2s, 20 megabytes for each test case.
Related
In following contests: