【No.10】蓝桥杯构造法|两道例题(C++)

news/2024/7/7 19:58:16
什么是构造

构造题
要求解题者通过观察问题的结构和规律,找到一种通用的方法或模式,使得在问题规模增大时,依然能够高效地得到答案。

在解决构造题时,以下几点思考是很重要的:

  1. 观察问题规模的增长:了解问题随着规模的增大,答案的变化趋势。这可以帮助你找到一种通用的解决方案。
  2. 推广规律:尝试将你观察到的规律推广到更大的问题规模上。这可能涉及到数学归纳法或者其他类似的思考方式。
  3. 考虑状态转移(适用于动态规划等问题):如果问题可以通过状态转移来求解,那么要仔细考虑从一个状态到另一个状态的转移会带来什么影响。
  4. 模式识别:尝试寻找问题中的模式或者特征,这有助于你更好地理解问题的本质。
  5. 实践和练习:通过解决大量的构造题,你会逐渐培养出发现规律和应用通用方法的能力。
  6. 注意特殊情况:一些构造题在特定的情况下可能会有不同的解法或者规律,要注意考虑这些特殊情况。
    总的来说,解决构造题需要一定的观察力、归纳能力和数学思维。随着练习的增多,你会变得越来越熟练在这类问题上。
构造题目的特点
  1. 高自由度
    一道题的构造方式可能存在多种,但往往会有一种相对简单且能够满足题意的构造方式。
    这种特性看似降低了难度,使问题更易理解,但实际上,这种高自由度往往会导致考生在面对题目时感到迷茫,难以找到明确的解题思路。
  2. 形式的灵活性和多样性:
    并不存在一个通用解法或套路适用于所有构造题,甚至很难找出解题思路的天性。
    这意味着解决构造题需要考生具备灵活的思维,善于观察和归纳,以便在面对各种不同形式的题目时能够找到切入点和解题方法。

面对构造题的特点,通过以下方法更有效地解决这类问题

  1. 分析题目要求和条件:
    仔细阅读题目,确保你理解了题目的要求和所给的条件。
    弄清楚问题的背景和目标,明确你需要构造的内容或解决的问题。
  2. 尝试特例和极端情况:
    试图找出一些特殊情况下的解法,这可以帮助你更好地理解问题的本质。探索极端情况,看看在极端条件下是否会出现特殊的构造方式或者规律
  3. 寻找模式和规律:
    观察题目中是否存在一些明显的模式或者规律,这可能是解决问题的关键尝试从已知的情况中找到一般性的解法,并推广到更一般的情况。
  4. 尝试逆向构造:
    从问题的反面思考也可以给出有用的线索。尝试反向推导出符合条件的情况。
  5. 使用数学归纳法:
    尝试使用数学归纳法证明某种构造方式在所有情况下都成立。
  6. 灵活运用已知知识:
    将已学的数学、物理、逻辑等知识灵活应用,可能会为你找到新的解法。
  7. 反复实践和总结:
    多做类似的题目,总结解题经验,找出有效的解题方法,虽然不存在通解,但是部分构造题可能会用到相似的套路,如果能够有做题的广度并且经常总结,那么对于你解决构造题目是非常有帮助的。
  8. 保持耐心和信心:
    构造题可能需要时间和多次尝试才能找到合适的解法,保持耐心和信心是很重要的
构造的应用场景

构造题目在算法竞赛中起着重要的作用,它们旨在考察选手对问题的抽象能力、发现规律的能力以及解决问题的创造性思维。以下是一些构造题目在算法竞赛中的常见应用场景:

  1. 数学问题:
    构造满足一定条件的数列、集合或排列组合。
    利用数学关系构造出特定的解。
  2. 图论问题:
    ·构造特定的图结构,如树、图、有向图等。
    根据题意构造出满足条件的图。
  3. 字符串处理:
    构造满足字符串性质的解,如回文串、循环字符串等,
    构造满足特定字符串操作的解。
  4. 组合与排列:
    构造出满足一定条件的排列或组合
    根据条件构造特定的排列组合解。
  5. 游戏策略:
    设计游戏规则,构造出有趣的游戏场景,考验选手的策略思维。
  6. 逻辑推理:
    构造逻辑谜题或者推理题,要求选手根据题目信息进行推理,得出正确答案。
  7. 数据结构:
    构造特定的数据结构,如堆、树、图等,要求选手在构造的基础上进行一系列操作
  8. 动态规划:
    构造状态转移方程,设计合适的状态表示,构造动态规划解。
  9. 贪心算法:
    构造出合适的贪心策略,使得贪心策略能够得到最优解
  10. 模拟问题:
    设计模拟题,要求选手模拟特定场景或过程,根据模拟的结果得出答案

这些是一些常见的构造题目应用场景。构造题目的特点是多样化,可以涵盖许多不同的领域和难度级别,有助于培养选手的创造性解决问题的能力。因此,在算法竞赛中,构造题目通常被认为是一种重要的题型。

例题1

蓝桥小蓝喜欢数学,他特别喜欢做数学题,有一天他遇到了一个有趣的数学题:
1 x + 1 y + 1 z = 1 N \frac{1}{x}+\frac{1}{y}+\frac{1}{z}=\frac{1}{N} x1+y1+z1=N1
现在给定一个正整数N,小蓝想知道当x、y、z取何值时,上述等式成立。请你帮助小蓝找到满足条件的整数 x、y、z。
输入:
输入包含一个正整数N(1≤N≤1000)。
输出:
如果存在满足条件的整数x、y,z,则输出一个满足条件的解,以空格分隔。如果有多组解请输出任意一组即可。
如果不存在满足条件的解,则输出"No Solution"。

样例

样例1:
输入:N=1
输出:2 3 6
样例2:
输入:N =2
输出:4 6 12

题目解析

1 x + 1 y + 1 z = 1 N \frac{1}{x}+\frac{1}{y}+\frac{1}{z}=\frac{1}{N} x1+y1+z1=N1
这个题如果数学题做的多的话,我们能够很快想到:
当N=2时, 1 / 2 = 1 / 4 + 1 / 4 , 1 / 4 = 3 / 12 = 1 / 12 + 2 / 12 = 1 / 12 + 1 / 6 1/2=1/4+1/4,1/4=3/12=1/12+2/12=1/12+1/6 1/2=1/4+1/41/4=3/12=1/12+2/12=1/12+1/6,所以 x = 4 , y = 6 , z = 12 x=4 ,y=6, z=12 x=4,y=6,z=12
当N=3时, 1 / 3 = 1 / 6 + 1 / 6 , 1 / 6 = 3 / 18 = 1 / 18 + 2 / 18 = 1 / 18 + 1 / 9 1/3=1/6+1/6,1/6=3/18=1/18+2/18=1/18+1/9 1/3=1/6+1/6,1/6=3/18=1/18+2/18=1/18+1/9,所以 x = 6 , y = 9 , z = 18 x=6, y=9 ,z=18 x=6,y=9,z=18
这里的答案就跟样例不同了,因为是构造体,案比较开放,题目的样例是随机出现,一般出题人可能会用一些比较偏的数据误导做题人。
当N=4时, 1 / 4 = 1 / 8 + 1 / 8 , 1 / 8 = 1 / 12 + 1 / 24 1/4=1/8+1/8,1/8=1/12+1/24 1/4=1/8+1/81/8=1/12+1/24,所以 x = 8 , y = 12 , z = 24 x=8 ,y=12, z=24 x=8,y=12,z=24
显然我们可以推导得到,
当N=n时, x = 2 n , y = 3 n , z = 6 n x=2n, y=3n,z=6n x=2n,y=3n,z=6n为原式的一组解
这个题目可以归类于数学题目,我们需要构造出一组满足某个式子的解。

除此之外,有个关于1/n的推论1/n=1/(n+1)+1/(n*(n+1))
1 n = 1 n + 1 + 1 n ∗ ( n + 1 ) \frac{1}{n}=\frac{1}{n+1}+\frac{1}{n*(n+1)} n1=n+11+n(n+1)1
令n+1=t则 1 n + 1 = 1 t \frac{1}{n+1}=\frac{1}{t} n+11=t1再带入 1 n \frac{1}{n} n1的公式得 1 t = 1 t + 1 + 1 t ∗ ( t + 1 ) \frac{1}{t}=\frac{1}{t+1}+\frac{1}{t*(t+1)} t1=t+11+t(t+1)1
t=n+1带回得, 1 n + 1 = 1 n + 2 + 1 ( n + 1 ) ∗ ( n + 2 ) \frac{1}{n+1}=\frac{1}{n+2}+\frac{1}{(n+1)*(n+2)} n+11=n+21+(n+1)(n+2)1
原式 1 n = 1 n + 1 + 1 ( n ) ∗ ( n + 1 ) = 1 n + 2 + 1 ( n + 1 ) ∗ ( n + 2 ) + 1 n ∗ ( n + 1 ) \frac{1}{n}=\frac{1}{n+1}+\frac{1}{(n)*(n+1)}=\frac{1}{n+2}+\frac{1}{(n+1)*(n+2)}+\frac{1}{n*(n+1)} n1=n+11+(n)(n+1)1=n+21+(n+1)(n+2)1+n(n+1)1
当n=2时, 1 2 = 1 4 + 1 12 + 1 6 , x = 4 , y = 6 , z = 12 \frac{1}{2}=\frac{1}{4}+\frac{1}{12}+\frac{1}{6},x=4,y=6,z=12 21=41+121+61,x=4,y=6,z=12
当n=3时, 1 3 = 1 5 + 1 20 + 1 12 , x = 5 , y = 12 , z = 20 \frac{1}{3}=\frac{1}{5}+\frac{1}{20}+\frac{1}{12},x=5,y=12,z=20 31=51+201+121,x=5,y=12,z=20

例题2

给定一个正整数n。你的任务是找到任意三个整数a、b和c(0≤a,b,c≤10^9),使得(a㊉b)+(b㊉c)+(a㊉c)=n,或者确定不存在这样的整数。
这里,a㊉b表示a和b的按位异或运算。例如,2㊉4=6,3㊉1=2。

输入

每个测试包含多个测试用例。
第一行包含一个整数t(1≤t≤10^4)–测试用例的数量。接下来的t行包含测试用例的描述
每个测试用例的唯一一行包含一个整数n(1≤n≤10^9)

输出

对于每个测试用例,输出任意三个整数a、b和c(0≤a,b,c≤10^9),使得(a㊉b)+(b㊉c)+(a㊉c)=n。如果不存在这样的整数,则输出-1。

题目解析

多组样例,每组样例一个n,问我们能不能找到三个数满足等式(a㊉b)+(b㊉c)+(a㊉c)=n,如果能找到就输出a,b,c,否则输出-1

首先,我们可以观察到以下性质:
奇数与奇数进行异或运算会得到一个偶数。
偶数与偶数进行异或运算会得到一个偶数。·
奇数与偶数进行异或运算会得到一个奇数。

因此,当a、b、c三个数全为奇数或者全为偶数时,得到的结果n一定是一个偶数。
当a、b、c中有两个为奇数时,我们可以假设a、b为奇数,那么n的结果为偶数+奇数+奇数=偶数。
同样地,当a、b、c中有两个为偶数时,我们可以假设a、b为偶数,那么n的结果为偶数+奇数+奇数=偶数。
综上所述,无论a、b、c取值如何,都无法得到一个奇数。
因此,当n为奇数时,一定无解。而当n为偶数时,我们可以取a=b=n>>1,c=0,这样就构成了一个满足题意的解

编码和调试技巧
  1. 变量定义:
    一看就明白变量名和函数名
    方便自己理解
    方便和别人交流
  2. 数据结构:静态数组就是一切
    不用指针
    用静态数组或者内置工具实现所有的数据结构
  • 队列
  • 链表
  1. 数组范围和循环范围
    1. 数组范围
      a[0] ~ a[n-1]
      a[1] ~ a[n]
    2. sort()范围
  2. 提高可读性,逻辑功能的划分
    时间充足的情况下
    把一个单独的逻辑功能写成一个函数
    只要能独立的功能,尽量用函数单独实现
  3. 没有明确终止的输入,多组输入
while (cin >> n){do thing}
while (scanf("%d", &n) != EOF){do thing}

http://lihuaxi.xjx100.cn/news/2109254.html

相关文章

使用 mypy 做 type check

前言 完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码: # 抽象迭代器类 class Iterator(…

HTML世界之标签Ⅴ

目录 一、meter 标签 二、nav 标签 三、noscript 标签 四、object 标签 五、ol 标签 六、optgroup 标签 七、option 标签 八、output 标签 九、param 标签 十、pre 标签 十一、picture 标签 一、meter 标签 <meter> 标签定义度量衡。仅用于已知最大和最小值的…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

19.WEB渗透测试--抓包技术(下)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;18.WEB渗透测试--抓包技术&#xff08;上&#xff09;-CSDN博客 Burp含义和内容参考&…

# Maven Bom 的使用

Maven Bom 的使用 文章目录 Maven Bom 的使用概述BOM特点优点缺点 MavenMaven 安装安装步骤settingx.ml常用仓库地址Idea 使用maven常见坑 SpringBoot 项目Bom使用案例项目结构主项目 zerocode-back-servezc-dependency&#xff08;第三方jar管理&#xff09;子模块zc-serve子模…

Linux:Prometheus的源码包安装及操作(2)

环境介绍 三台centos 7系统&#xff0c;运行内存都2G 1.prometheus监控服务器&#xff1a;192.168.6.1 主机名&#xff1a;pm 2.grafana展示服务器:192.168.6.2 主机名&#xff1a;gr 3.被监控服务器&#xff1a;192.168.6.3 …

【堆、位运算、数学】算法例题

目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…

生成凹形曲线算法技术实践

1. 需求目标 生成曲线&#xff0c;以生成凹形曲线为例&#xff0c;如下图所示。 凹形曲线描述如下&#xff1a; 左边高点为y25&#xff08;均值&#xff09;&#xff0c;跨度4&#xff08;x[0,5)&#xff09;&#xff1b;中间最低点为y2&#xff08;均值&#xff09;&#x…