目录
A-小红的签到题
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
char ch='a';
for(int i=0;i<n;i++){
if(i==1) cout<<"_";
else cout<<ch;
}
}
B-小红的模拟
代码
#include<bits/stdc++.h>
using namespace std;
char a[1010][1010];
int main(){
int n,m;
cin>>n>>m;
int x=0,y=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='#'){
x=i,y=j;
}
}
}
if(x<n&&y>1){
for(int i=1;i<n;i++){
cout<<"S";
}
for(int i=1;i<m;i++){
cout<<"D";
}
}
else{
for(int i=1;i<m;i++){
cout<<"D";
}
for(int i=1;i<n;i++){
cout<<"S";
}
}
}
C-小红的方神题
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n==1||n==2){
cout<<"-1";
return 0;
}
cout<<1<<" "<<n<<" ";
for(int i=n-1;i>=2;i--){
cout<<i<<" ";
}
}
D-小红的数学题
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int k;
cin>>k;
k=k+1;
for(int i=2;i*i<=k;i++){
if(k%i==0){
int a=i-1,b=k/i-1;
int p=a+b;
int q=a*b;
cout<<p<<" "<<q<<"\n";
return 0;
}
}
cout<<-1;
}
有注释版
#include<bits/stdc++.h> // 引入所有标准库头文件,方便使用如cin、cout、sqrt等
using namespace std;
#define int long long // 将int替换为long long,防止整数溢出,支持较大数字如1e12
signed main() { // 主函数,使用signed是为了与#define int long long兼容
int k;
cin >> k; // 输入正整数k
k = k + 1; // 将k加1,方便后续分解因数。解释见下。
// 枚举从2到sqrt(k)的每个整数,寻找k的因数
for (int i = 2; i * i <= k; i++) {
if (k % i == 0) { // 如果i是k的因数
// 设i = a + 1,则a = i - 1
// k / i = b + 1,则b = k / i - 1
int a = i - 1, b = k / i - 1;
// 构造p = a + b,q = a * b
// 对应二次方程:x^2 - p*x + q = 0
int p = a + b;
int q = a * b;
// 输出满足条件的一组p和q
cout << p << " " << q << "\n";
return 0; // 输出后直接结束程序
}
}
// 如果没有找到任何满足条件的(a, b),输出-1
cout << -1;
}
E-小红的ds题
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000010],b[1000010];
int l[1000010],r[1000010];
signed main(){
int n;
cin>>n;
int s=0;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1]+a[i];
s+=a[i];
}
cout<<1<<"\n";
int node=2;
int f=0;
int fu=1;
for(int i=2;i<=n;i++){
int x=a[i];
int cnt=0;
while(x--){
if(f==0){
l[fu]=node;
f=1;
cnt++;
}
else{
r[fu]=node;
f=0;
cnt++;
}
if(cnt==2){
fu++;
cnt=0;
}
node++;
}
fu=b[i-1]+1;
}
for(int i=1;i<=s;i++){
if(l[i]==0) l[i]=-1;
if(r[i]==0) r[i]=-1;
cout<<l[i]<<" "<<r[i]<<"\n";
}
}
有注释版
#include<bits/stdc++.h> // 引入所有标准库
using namespace std;
#define int long long // 将int定义为long long,避免数据溢出
int a[1000010], b[1000010]; // a表示每层节点数,b为前缀和数组
int l[1000010], r[1000010]; // l和r分别表示每个节点的左儿子和右儿子
signed main() {
int n;
cin >> n; // 输入层数 n
int s = 0; // s 为所有节点数总和
// 读取每层的节点数,并计算前缀和 b[i],以及总节点数 s
for(int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = b[i-1] + a[i]; // b[i] 表示前 i 层的节点总数
s += a[i]; // s 是所有层的节点数之和
}
cout << 1 << "\n"; // 输出根节点的编号为 1
int node = 2; // node 表示下一个要分配的节点编号,从2开始(1是根)
int f = 0; // f 用于交替分配左右儿子(0 表示左儿子,1 表示右儿子)
int fu = 1; // fu 表示当前正在分配子节点的父节点编号
// 从第二层开始为每一层的节点安排父节点连接关系
for(int i = 2; i <= n; i++) {
int x = a[i]; // 当前层的节点数
int cnt = 0; // 当前父节点已经连接了几个子节点(最多2个)
// 为当前层的每个节点分配父节点连接(左或右儿子)
while(x--) {
if(f == 0) {
l[fu] = node; // 当前父节点的左儿子设为 node
f = 1; // 下一次连接右儿子
cnt++; // 已连接一个子节点
} else {
r[fu] = node; // 当前父节点的右儿子设为 node
f = 0; // 下一个父节点开始连接左儿子
cnt++; // 已连接第二个子节点
}
if(cnt == 2) { // 如果当前父节点已经连接两个儿子
fu++; // 切换到下一个父节点
cnt = 0; // 重置计数
}
node++; // 准备分配下一个新节点
}
fu = b[i-1] + 1; // 更新 fu 为当前层第一个父节点的编号(第 i-1 层的第一个节点编号 + 1)
}
// 输出每个节点的左右儿子编号,如果没有则输出 -1
for(int i = 1; i <= s; i++) {
if(l[i] == 0) l[i] = -1; // 没有左儿子
if(r[i] == 0) r[i] = -1; // 没有右儿子
cout << l[i] << " " << r[i] << "\n"; // 输出结果
}
}