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

牛客周赛 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;
}

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

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

http://www.xdnf.cn/news/5580.html

相关文章:

  • C++23 中的 views::stride:让范围操作更灵活
  • 「华为」人形机器人赛道投资首秀!
  • STM32核心机制解析:重映射、时间片与系统定时器实战——从理论到呼吸灯开发
  • fiddler 配置ios手机代理调试
  • 保持Word中插入图片的清晰度
  • ✅ TensorRT Python 安装精简流程(适用于 Ubuntu 20.04+)
  • CVPR2025 | Prompt-CAM: 让视觉 Transformer 可解释以进行细粒度分析
  • 如何应对网站被爬虫和采集?综合防护策略与实用方案
  • 5.12第四次作业
  • spring常用注解
  • 从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?
  • 【C++贪心】P11044 [蓝桥杯 2024 省 Java B] 食堂|普及
  • 华为FAT AP配置 真机
  • Java学习手册:服务网关与路由
  • 《Effective Python》第1章 Pythonic 思维详解——深入理解流程控制中的解构利器match
  • Bravery靶机通关笔记
  • 机器学习管道 pipeline
  • OpenCV中Canny、Sobel和Laplacian边界检测算法原理和使用示例
  • django之视图
  • OpenCV图像金字塔详解:原理、实现与应用
  • 医院保洁智能化管理新范式:诺怀云医院后勤解决方案的实践探索
  • edge设置位IE模式打开网页
  • Java设计模式之装饰器模式:从基础到高级的全面解析(万字解析)
  • 【速写】KV-cache与解码的再探讨(以束搜索实现为例)
  • C 语言_可变参数宏详解
  • 硅基计划2.0 学习总结 壹 Java初阶
  • pytorch模型画质增强简单实现
  • STM32入门教程——GPIO输出
  • Java设计模式之代理模式:从入门到精通(保姆级教程)
  • http和https的区别