【每日一题】备战冲击蓝桥杯国赛——Python程序设计 | Day19 | 异或数列 | 真题代码解析

💖作者简介:大家好,我是车神哥,府学路18号的车神🥇
⚡About—>车神:从寝室实验室快3分钟,最慢3分半(半分钟献给绿
📝个人主页:车手只需要车和手,压力来自论文_府学路18号车神_CSDN博客
🥇 官方认证:人工智能领域优质创作者
🎉点赞评论收藏 == 养成习惯一键三连)😋

⚡希望大家多多支持🤗~一起加油 😁


每天刷一道题,话不多说,先刷近两年的题吧,现在是2021年的真题了,如果有一起的可以加入我们!!!

一起来刷题,冲击国赛!!!


扫码 我的主页 网页左边下方 群二维码

加入方式:可以在下方的微信名片加我,然后拉你入群。(记得备注暗号我要拿国奖


2021年第十二届蓝桥杯赛题总览

2020年的题就是这些,类型分为两种,分别是结果填空和程序设计,我们每天刷一道题,省赛没问题!
在这里插入图片描述

异或数列 (题目)

(本题总分:20分)

官方练习系统:https://www.lanqiao.cn/problems/1462/learning/


—>【问题描述】

在这里插入图片描述


解析


通过阅读题干,本题——难度中上:⭐⭐⭐⭐

考察类型:动态规划、取模

考察知识点:dp


分析:

这道题是考动态规划。下面就设计一下动态规划吧!~

  1. 状态设计:dp(i, j)表示前i个括号插入若干个括号后,左括号比有括号多j个的插入方法数字。
  2. 状态转移方程:dp(i,j)=dp(i-1,j-1)( s t r i str_i stri左括号),dp(i,j)= Σ k = 0 j + 1 d p ( i − 1 , k ) \Sigma_{k=0}^{j+1}dp(i-1, k) Σk=0j+1dp(i1,k) s t r i str_i stri右括号)
  3. 状态转移优化:当 s t r i str_i stri为右括号时,因 d p ( i , j − 1 ) = Σ k = 0 j d p ( i − 1 , k ) dp(i,j-1)=\Sigma_{k=0}^{j}dp(i-1,k) dp(i,j1)=Σk=0jdp(i1,k),由此dp(i,j)=dp(i-1,j+1)+dp(i,j-1)。利用前缀和将 O ( n ) O(n) O(n)的状态转移方程优化为 O ( 1 ) O(1) O(1)
  4. 初始状态: d p ( 0 , 0 ) = 1 dp(0,0)=1 dp(0,0)=1

CAUTION:要增加 vis 数组用于表示 dp 数组每个位置取模前的实际值是否为 0,如果只判断 dp值可能会出现 dp值实际不为 0 但是因为取模恰好为 0 的情况(虽然因为这个模数的特殊性,这个情况出现的概率几乎为 0 )

周末摸摸鱼~

下面直接开干!!!


代码

Python代码实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/3/13 14:36
# @Author  : 府学路18号车神
# @Email   :yurz_control@163.com
# @File    : demo.py

# 请在此输入您的代码
T = int(input())
for _ in range(T):
    a = list(map(int, input().split()))
    dp = []
    sum = 0
    ma = 0
    n = len(a)
    for i in range(1, n):
        dp.append(a[i])
        sum ^= a[i]
        ma = max(ma, a[i])

    if sum == 0:  # 每个不同位上的0和1个数分别为偶数
        print(0)
        continue

    x = 1
    while x < ma:
        x <<= 1

    while x > 0:
        one = 0
        zero = 0
        for i in dp:
            if i & x == 0:  # 关于x的第某位是否为0
                zero += 1
            else:
                one += 1
        if one % 2 == 1:  # 关于x的第某位1的个数为奇数
            if zero % 2 == 1 and one > 1:
                print(-1)
            else:
                print(1)
            break
        x >>= 1  # 关于x的第某位1的个数为偶数,则退位向下再次判断

在这里插入图片描述

由此,我们可以快速得出结果,验证完毕!明天最后一天,加油!!!


今天开刷第 十九 天,欢迎大家加入,一起变强,一起自律,一起上国赛!!!

有不同解法的可以在下面留言哦!~

往期刷题路线:

刷题路线Detail
2020年
Day-01门牌制作
Day-02寻找2020
Day-03跑步锻炼
Day-04蛇形填数
Day-05排序
Day-06装饰珠
Day-07成绩统计
Day-08单词分析
Day-09数字三角形
Day-10平面切分
2021年
Day-11卡片
Day-12直线
Day-13货物摆放
Day-14路径
Day-15回路计数
Day-16时间显示
Day-17杨辉三角
Day-18左孩子右兄弟

官方刷题练习系统:http://lx.lanqiao.cn/


❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!冲击国赛
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )

  • 3
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 3
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

府学路18号车神

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值