有n个战士站在一排,分别编号1,2,3,...n,战士的战斗力等于他的编号,有一些战士只会进攻,有一些战士只会防守。现在我们要将他们从某个点开始分为两个阵营,假设这个点为pos(0<=pos<=n),则编号1,2,3,...pos的战士为第一个阵营,pos+1,pos+2,...n的战士为第二阵营。假设pos为0时,说明第一阵营没有战士,所有的战士都在第二阵营。我们令第一战士为进攻方,第二战士为防守方,假设第一个阵营中能够进攻的战士战斗力总和为w,第二个阵营中能够防守的战士战斗力总和为v,我们希望|w-v|的值最小,其中||为绝对值符号,求|w-v|的最小值。
输入描述:
第一行输入一个正整数n,表示战士的数量(1<=n<=10^5)
第二行给出一个字符串s,仅由字符0或者1组成,字符串中的每一位分别代表每一个战士的属性,0代表这个战士只会进攻,1代表这个战士只会防守。
输出描述:
输出一行一个整数表示|w-v|最小值。
示例1
输入
4
0011
输出
1
说明
假设我们在第二个位置切割,这样左边的字符串为00,右边的字符串为11,代表左边有2个会进攻的战士,战斗力之和为1+2=3,右边有2个会防守的战士,战斗力之和为3+4=7,即|w-v|=|3-7|=4。但如果我们在第三个位置切割,左边的字符串为001,右边的字符串为1,此时左边会攻击的战士战斗力之和还是3,右边会防守的战士战斗力之和为4,此时差值为1,差值最小。
示例2
输入
7
1000101
输出
2
思路:模拟题。需要踩坑的点就是需要考虑pos=0还有pos=n的特殊情况。(pos=0代表全是防守的战士,pos=n代表全是进攻的战士)。如果不考虑两个边界点,则只能AC 30%...
附上Python实现代码:
if __name__ == "__main__":
num=int(input())
#存的1-n的进攻或者防守总和
attackList=[]
defendList=[]
#对特殊情况进行初始化,0处填充0
attackList.append(0)
defendList.append(0)
attackSum=0
defendSum=0
soliderStr=input()
for k in range(num):
#为进攻方
if soliderStr[k]=='0':
attackSum+=(k+1)
attackList.append(attackSum)
defendList.append(defendSum)
#防守方
else:
defendSum += (k+1)
defendList.append(defendSum)
attackList.append(attackSum)
#python最大值
minDif=float('inf')
#0<=pos<=num,分别遍历pos
for pos in range(0,num+1):
#第一阵营 进攻的战力
attack=attackList[pos]
#第二阵营 防守的战力
defend=defendList[num]-defendList[pos]
minDif=min(minDif,abs(attack-defend))
print(minDif)