NC14619. 栗酱的异或和
描述
输入描述
多组数据,数据第一行T表示数据组数。
每组数据第一行一个n,k表示一共有n堆石子,接下来你试图从第k堆开始取,从第二行开始,每隔一个空格一个第i堆石子的数量ai。
n≤105, ai≤109
输出描述
输出“Yes”或“No”代表从该堆开始取是否可以必胜(如果足够聪明)。
示例1
输入:
2 3 2 1 2 3 2 1 2 1
输出:
No Yes
说明:
小太阳哥哥说,如果想赢,就试图把每堆石子数量的异或和变为0,最终便可以获得胜利,不相信自己证一下。C++(g++ 7.5.0) 解法, 执行用时: 14ms, 内存消耗: 284K, 提交时间: 2023-07-27 19:13:02
#include<cstdio> int T,n,K,m,tot; int main() { for(scanf("%d",&T);T;T--) { tot=0; scanf("%d%d",&n,&K); for(int i=1,x;i<=n;i++) { scanf("%d",&x); if(i==K) m=x; else tot^=x; } printf(tot<m?"Yes\n":"No\n"); } }
pypy3 解法, 执行用时: 157ms, 内存消耗: 35560K, 提交时间: 2023-02-20 19:46:55
for _ in range(int(input())): n,k = map(int,input().split()) l=list(map(int,input().split())) c=0 for i in l: c^= i if l[k-1]>l[k-1]^c: print("Yes") else: print("No")
Python3 解法, 执行用时: 67ms, 内存消耗: 15904K, 提交时间: 2022-01-14 11:30:15
for _ in range(int(input())): n,m=input().split() m=int(m) sum=0 p=list(map(int,input().strip().split())) for i in p: sum^=i print("Yes"if p[m-1]>(p[m-1]^sum) else "No")