3916: 攻与防(fight.cpp)
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:153
解决:28
题目描述
fight.in/out
有 n个战士站成一排,分别编号为 1,2,3. . .n,战士的战斗力等于他的编号 ,有一些战
士只会进攻,有一些战士只会防守。现在我们要将他们从某个点开始分成两个阵营,假设
这个点为 pos(0 ≤ pos ≤ n),则编号小于等于pos的战士为第一个阵营,编号大于pos的战士
为第二个阵营。我们令第一个阵营为进攻方,第二个阵营为防守方,假设第一个阵营中能
够进攻的战士战斗力总和为 w,第二个阵营中能够防守的战士战斗力总和为 v,我们希望
∣ w − v ∣ 的值最小,其中 || 为绝对值符号。求 ∣ w-v ∣ 的最小值。
输入
第一行输入一个正整数 n,表示战士的数量(即后续给出的字符串的长度)。
第二行给出一个字符串s,仅由字符 0 或 1 组成,字符串中的每一位分别代表
每一位战士的属性,0 代表这个战士只会进攻,1 代表这个战士只会防守。
输出
一行一个整数表示答案。
样例输入 复制
4
0011
样例输出 复制
1
提示
【样例 1 说明】
假设我们在第二个位置切割,这样左边的字符串为 0,右边的字符串为 1,代表左
边有 2 个会进攻的战士,战斗力之和为 1 + 2 = 3,右边有 2 个会防守的战士,战斗
力之和为 3 + 4 = 7,即 |w-v| = |3 − 7| = 4。但如果我们在第三个位置切割,左边
的字符串为 001,右边的字符串为 1,此时左边会攻击的战士战斗力之和还是 3,右边
会防守的战士战斗力为 4,此时差值为 1,差值最小。
【样例 2 说明】
第二个样例可以在第五个位置分割,即左边的字符串为 10001,右边的字符串为01,代表左
边有 3 个会进攻的战士,2 个会防守的战士,所有会攻击战士的战斗力之和即 w= 2 + 3 + 4 =
9;右边有 1 个会防守的战士,1 个会进攻的战士,所有会防守的战士的战斗力之和为 v= 7。所
以 |9 − 7| = 2。
【数据范围】
对于 20% 的数据,n ≤ 10
对于 40% 的数据,n ≤ 1000
对于 100% 的数据,n ≤ 100000