Easy Selection

题目描述

  这个游戏是这样的,wind先写下一排数。既然是一排,当然有首尾咯。
  wind和小杉(lolanv)每次只能从这排数的头或尾取一个数。最后谁取的数的和多,谁就赢了。如果两人的和一样多,先取者胜。
  有天swgr看到他们俩在玩这个游戏,很好奇。他想知道,在两人总是做出最优决策的情况下(两个人的智商都是很高的……),谁能取得最终的胜利呢?

输入数据

  第一行为一个数 k (k≤ 10) ,表示有 k 组测试数据。
  以下 k 组测试数据。
    每组测试数据中,第一行仅有一个偶数 n (0< n< 105)
    第二行也仅有一个数, 0 表示wind先取数, 1 表示小杉 (lolanv) 先取数
    第三行有 n 个数,是wind给出的一排数。这 n 个数的绝对值均不超过1e6

输出数据

  对每组测试数据输出一行
  表示在两人总是做出最优决策的情况下,最终的胜利者的名字,即 " wind" 或 " lolanv" (引号不输出)。

样例输入
2
2
1
1 3
2
0
1 3
样例输出
lolanv
wind

解题分析

整体思路

  先取的人可以比较所有奇数位置数之和与所有偶数位置之和,哪个大就一直取相应的位置上的数…注意n为偶数

步骤说明

  (1)开始时,假设A先取数,A可以在这n(n为偶数)个数字中,分别算出奇数位和偶数位上的数之和
  (2)假设偶数位上数字之和最大,当取走第n位数之后,轮到了B取数字,这个时候只能取第一位或第n-1位;
    1)B取第1位,下一次A取第2位
    2)B取第n-1位,下一次A取第n-2(n-2为偶数)位
  (3)依次类推,A取了偶数为之后,B只能取奇数位;当B取了奇数位m后,A在最优策略下,要取紧挨着B取的奇数位的下一位m+1(偶数位),这样可以按照之前计算的偶数位上的数字之和最大的方向取得最后的胜利

举例说明

  6 1000 564 48 400 2
  奇数位置和:6+564+400=970
  偶数位置和:1000+48+2=1050>970
  故先去的人可以先取2 后取的必定在奇数位置上取数(他只能取奇数位置的了)
PS:先取的不一定是当前最优

代码
if __name__ == "__main__":
    groups = int(input())
    for i in range(groups):
        n = int(input())
        who = int(input())
        array = list(map(int, input().split()))
        if who == 0:
            print("wind")
        else:
            print("lolanv")
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还能坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值