牛客竞赛刷题笔记

赢的次数

Alice 和 Bob在玩游戏。一共玩了 n局。二者的胜利的概率都是1/2。求 Alice 赢几次的可能性最大。输出最有可能赢几次,如果有多个结果,从小到大输出。一行若干个数,每个数之间一个空格,表示有可能赢的次数。

输入
2
输出
1
用11表示赢,用00表示输的话,共有
0000
0101
1010
1111
这四种情况,显然赢11次的概率最大

"""
赢k次的概率是Cnk/2^n,而这一组合数在n/2时取得最值,所以只要判断n为奇数还是偶数即可,有两种方法判断n是奇数还是偶数
第一种判断输入的数a&1是否为真,为真说明是奇数,输出中位数和中位数➕ 1,否则为偶数,输出n的中位数
第二种,是直接除二判断n是奇数还是偶数,然后执行对应的输出语句,"""
n = int(input())
if n % 2 == 0:
    print(n//2,n//2+1)
else:
    print(n//2)

字段和

给定一个序列,问你有没有可能重新排列这个序列使得所有长度小于等于 2 的子区间和不等于 0。一行一个字符串。"YES"表示可能重新排列这个序列使得所有长度小于等于 22 的子区间和不等于 00,反之则输出“NO”。输出不含引号。

输入:
6
34 1345 -3542 -1423 4213 1
输出:
YES

输入:
4
1 1 -1 1 (无论怎样排列,-1−1 总和至少 11 个 11 相邻,所以总存在一个和为 00 的长度为 22 的子段。)
输出:
NO
输入:
5
1 5 -1 -5 0 (0 的存在使得总有一个长度为 11 的子段和为 0)
输出:
NO

n = int(input())  
l = list(map(int, input().split()))
if 0 in l:    # 如果输入的数(即长度为1的序列)中 包括0,就直接返回NO
    print('NO')
else:
    l = list(set(l))  # 通过set对序列进行去重,但是去重后返回一个集合,所以需要通过list进行强转
    if len(l) == 2 and l[0] + l[1] ==0:   # 如果列表长度为2,并且两个数字相加和为0,就返回NO
        print('NO')
    else:
        print('YES')     # 如果长度为1的序列中没有0元素,且长度为2时去重后的元素相加不为0,就返回YES

你可能感兴趣的:(刷题笔记,python,开发语言,学习)