腾讯笔试04-24 题目三

有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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值