当前位置: 首页 > news >正文

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题

现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征,请保证该变量至少由两个单词组成。

输入描述:

输入一个正整数 n(3≦n≦100),代表需要构造的变量长度。

输出描述:

输出一个长度为 n 的字符串,代表你所构造的使用了下划线命名法命名的变量。 如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。

示例1

输入

11

输出

kato_megumi

解题思路:根据长度n构造答案

#include<bits/stdc++.h>
using namespace std;
int main(){int n; cin>>n;cout<<"f_"<<string(n-2,'f')<<endl;
}

 2. 小红的模拟题

给定一个 n 行 m 列的网格,我们使用 (i,j) 表示网格中从上往下数第 i 行和从左往右数第 j 列的格子。小红现在位于 (1,1),准备前往 (n,m)。
然而,不是所有的格子都是可以通行的,有且恰有一个格子是陷阱格,一旦小红踏入陷阱格,就会直接去逝。保证这个陷阱格不会出现在 (1,1)和 (n,m)。
小红每一步只能向右或者向下前进。请你帮小红规划一条行动路线,使得她可以顺利到达 (n,m)。
行动路线为一个仅由字符 ‘D’、‘S’ 构成的字符串 s,第 i个字符代表小红第 i 次行动的方向。记第 iii 次行动前小红位于 (x,y),则:
,若si​=‘D’,则小红向右移动一格即抵达 (x,y+1);
,若si​=‘S’,则小红向下移动一格即抵达(x+1,y)。

解题思路:由于陷阱只有一个, 从(1,1) 到 (n,m), 特殊情况一种是往右n-1步, 往下走m-1步, 另一种是往下走m-1步, 往右走n-1步, 陷阱最多只会出现在上述两条路径中的一条之中, 所以依次探测即可 

#include <bits/stdc++.h>
using namespace std;
int main() {int n, m;cin >> n >> m;vector<string> grid(n);for(int i=0;i<n;i++) cin>>grid[i];bool f1=true;for(int i=1;i<n;i++){if(grid[i][0]=='#') f1=false;}for(int j=1;j<m;j++){if(grid[n-1][j]=='#') f1=false;}if(f1){for(int i=1;i<n;i++) cout<<'S';for(int j=1;j<m;j++) cout<<'D';return 0;}bool f2=true;for(int j=1;j<m;j++){if(grid[0][j]=='#') f2=false;}for(int i=1;i<n;i++){if(grid[i][m-1]=='#') f2=false;}if(f2){for(int i=1;i<m;i++) cout<<'D';for(int i=1;i<n;i++) cout<<'S';return 0;}return 0;
}

 3.小红的方神题

题目描述

对于数组 a,我们定义它的退化状态为:取每个相邻两数之差的绝对值构成的新数组。换句话说,退化后的 a 数组是一个长度为len(a)−1 的数组,其第 i 个元素为 ∣ai​−ai+1​∣。
 希望小红构造一个长度为 n 的排列,使得其连续进行n−1 次退化后,最终生成的一个整数恰好等于 n−2。你能帮帮小红吗?如果不存在这样的排列,直接输出 −1 即可。
长度为 n 的排列是由 1,2,…,n 这 n个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,{2,3,1,5,4} 是一个长度为 5 的排列,而 {1,2,2} 和 {1,3,4} 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。

解题思路: 1/2都不行, n>=3时候, 构造[1,n,n−1,…,2]  相邻差后为:[|1-n|, 1,1,....], 再退化一次为, n-2, 满足题意。

#include <bits/stdc++.h>
using namespace std;
int main(){int n; cin>>n;if(n<=2) { cout<<-1<<endl; return 0; }cout<<1;for(int i=n;i>=2;i--){cout<<" "<<i;}cout<<endl;return 0;
}

4. 小红的数学题 

题目描述

小红拿到了一个正整数 k,她希望你找到两个正整数 p,q,满足 p+q=k,且方程 x^2−px+q=0 存在两个正整数解。特别地,如果不存在这样的 p,q,请输出 −1。

解题思路:设方程的两个根为x1和x2,

x1+x2=p,

x1*x2=q,

x1+x2+x1*x2=k,

x1+x2+x1*x2+1=k+1 

(x1+1)*(x2+1)=k+1

所以, 我们可以将k+1, 分解成两个>=2的数的乘积(a,b)

x1+1=a, x2+1=b, 

p=a+b-2, q=(a-1)*(b-1)

#include <bits/stdc++.h>
using namespace std;
int main(){long long k;cin >> k;long long t = k + 1;long long A = -1, B = -1;for (long long d = 2; d * d <= t; d++) {if (t % d == 0) {A = d;B = t / d;break;}}if (A == -1){cout << -1 << endl;}else{long long p = (A + B - 2);long long q = (A - 1) * (B - 1);cout << p << " " << q << endl;}return 0;
}

 5. 小红的ds题

小红希望你构造一棵层数为 n 的二叉树,其第 i 层恰好有 ai​ 个节点。你能帮帮她吗?
一棵树被称为二叉树,当且仅当其满足:
,∙每个节点要么没有父节点连接(此时该节点被称为根节点)、要么被 1 个父节点连接(此时该节点被称为父节点的子节点;

∙每个节点连接的子节点数量要么为 0(此时该节点被称为叶子节点)、要么小于等于 2(此时该节点被称为分支节点)。

#include <bits/stdc++.h>
using namespace std;
int main() {int n;  cin >> n;vector<int> nums(n);  int total = 0;for (int i = 0; i < n; i++) {cin >> nums[i];total += nums[i];}vector<int> son_cnt(total, 0);     vector<vector<int>> tmp(total);   int start = 0;int pt = nums[0];  for (int i = 1; i < n; i++) {int new_start = pt;while (nums[i]--) {while (son_cnt[start] == 2) {start++;}son_cnt[start]++;tmp[start].push_back(pt);pt++;}start = new_start;}cout << 1 << endl;  for (int i = 0; i < total; i++) {if (tmp[i].empty()) {cout << "-1 -1"<<endl;} else if (tmp[i].size() == 1) {cout << "-1 " << tmp[i][0] + 1 <<endl;} else {cout << tmp[i][0] + 1 << ' ' << tmp[i][1] + 1 << endl;}}return 0;
}

6.小红的小苯题 

题目描述

小苯希望小红构造一个 n 行 m 列的矩阵,满足:
,∙每一行所有元素的异或和、每一列所有元素的异或和,这 n+m 个数恰好构成一个长度为 n+m的排列
∙矩阵中每个元素的值在 0 到 10^9 之间。
你能帮帮小红吗?
长度为 n 的排列是由 1,2,…,n 这 n 个整数、按任意顺序组成的数组(每个整数均恰好出现一次)。例如,{2,3,1,5,4} 是一个长度为 5 的排列,而 {1,2,2} 和 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。

解题思路(详细思考过程):

n行m列

设每一行所有元素的异或和分别为R1, R2, R3, .... ,Rn

设每一列所有元素的异或和分别为C1, C2, C3,....Cm

这些 n+m 个行异或和和列异或和合在一起,正好是 1,2,…,n+m 的一个排列

那我们应该怎么构造呢?

我们可以直接让行异或和Ri=i(第 1 行异或和是 1,第 2 行是 2,……,第 n 行是 n)

列异或和 Cj​=n+j(即第 1 列异或和是 n+1,第 2 列是 n+2,……,第 m 列是 n+m)

这个{Ri}U{Cj} ={1,2,3,4,....,n+m}

所有的行异或和R1 xor R2 xor R3 xor...xor Rn应该等于所有列异或和C1 xor C2 xor C3 xor ...xor Cm (因为矩阵的总异或和可以从行或列两个方向计算)

因此, (R1 xor R2 xor R3 xor...xor Rn) xor (C1 xor C2 xor C3 xor ...xor Cm) =0

=> 1 xor 2 xor 3 xor ...xor (n+m)=0

所以, 

只有 1 到 n+m 的异或和为 0 时,才能构造出这样的矩阵

具体构造:

为了简化问题, 

除了最后一列和最后一行,其他位置都填 0

填最后一列(行异或和)

对于前 n−1 行,让它们的最后一列等于行异或和 a[i][m]=Ri =i

(第i行的异或和就是0 xor 0 xor ...i=i)

填最后一行(列异或和)

对于前 m−1 行,让它们的最后一列等于列异或和 a[n][j]=Ci =n+j

(第j列的异或和就是0 xor 0 xor ...(n+j)=n+j)

最后填A[n][m]这个位置, A[n][m]需要同时满足:

1. 第n行的异或和是Rn=n, 2. 第m列的异或和是 Cm=n+m

第 n 行的异或和是 C1 xor C2 xor C3 xor ,,, xor Cm-1 xor t =n

 (n+1) xor (n+2) xor ... xor (n+m-1) xor t=n

所以, t1=n xor (n+1) xor (n+2) xor ... xor (n+m-1) 

同理, 

第m列的异或和是 R1 xor R2 xor R3 xor ... xor Rn-1 xor t

1 xor 2 xor ... xor (n-1) xor t= n+m

所以, t2=(n+m) xor 1 xor 2 xor ... xor (n-1) 

注:t1==t2

最后, 简单说一下代码中各部分的含义

solve函数:计算前k个数的异或和是否等于0

a数组:初始化待构造的数组

然后分别填最后一列的前n-1行, 最后一行的前m-1列

最后填充右下角的元素, 

按t2进行计算

最后输出构造的a数组即可

  1. 性质:1⊕2⊕⋯⊕(n+m)=0。

  2. 构造方法

    • 前 n−1n−1 行的最后一列填 i+1i+1(保证行异或和)

    • 前 m−1m−1 列的最后一行填 n+j+1n+j+1(保证列异或和)

    • 右下角填 T=(n+m)⊕(1⊕2⊕⋯⊕(n−1))T=(n+m)⊕(1⊕2⊕⋯⊕(n−1))。

  3. 输出:直接打印矩阵

#include <bits/stdc++.h>
using namespace std;
int solve(int k) {int ans=0;for(int i=0;i<=k;i++){ans^=i;}return ans;
}
int main(){int n, m;cin >> n >> m;if (solve(n + m) != 0) {cout << -1 << endl;return 0;}vector<vector<long long>> a(n, vector<long long>(m, 0));for (int i = 0; i < n - 1; i++) {a[i][m-1] = i + 1;            }for (int j = 0; j < m - 1; j++) {a[n-1][j] = n + (j + 1);      }long long x = 0;for (int i = 1; i <= n - 1; i++) x ^= i;long long t = (n + m) ^ x;        a[n-1][m-1] = t;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cout << a[i][j] << (j+1<m? ' ' : '\n');}}return 0;
}

感谢大家的点赞和关注,你们的支持是我创作的动力!(有疑问可以发布到评论区)

吐槽:感觉比京津冀某蓝某桥某杯略难吧(想了解可以看我往期题解)

相关文章:

  • 基于亚博K210开发板——LCD显示图片测试
  • 数据结构-树(1)
  • spring中的@Lazy注解详解
  • Feed流推送之订阅推送
  • 五、框架实战:SSM整合原理和实战
  • 树莓派4 yolo 11l.pt性能优化后的版本
  • continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手
  • 矩阵键盘模块
  • 05_jdk8新特性
  • linux服务器免密脚本分享
  • dfs 第一次加训 详解 下
  • 【Rust泛型】Rust泛型使用详解与应用场景
  • 十四、继承与组合(Inheritance Composition)
  • 面试题解析 | C++空类的默认成员函数(附生成条件与底层原理)
  • Ollama+OpenWebUI+docker附带软件下载链接,配置流程,适合内网部署,可以多人内网使用
  • Spark目前支持的部署模式。
  • C#里WPF使用触发器实现鼠标点击响应
  • 【Linux笔记】——进程信号的产生
  • 麒麟系统安装.net core环境变量
  • OCCT 知识笔记之TopoDS_Compound 详解
  • 专访|韩国世宗研究所中国研究中心主任:李在明若上台将推行均衡外交
  • 盖茨说对中国技术封锁起到反作用
  • 人民时评:莫让“假俗乱”讲解侵蚀“文博热”
  • 普京:俄中关系是国家间关系的真正典范
  • 著名文物鉴赏家吴荣光逝世,享年78岁
  • 巴西总统卢拉昨晚抵达北京