牛客周赛 Round 92
目录
A-小红的签到题
代码
B-小红的模拟
代码
C-小红的方神题
代码
D-小红的数学题
代码
无注释版
有注释版
E-小红的ds题
代码
无注释版
有注释版
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,防止整数溢出,支持较大数字如1e12signed main() { // 主函数,使用signed是为了与#define int long long兼容int k;cin >> k; // 输入正整数kk = 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 - 1int a = i - 1, b = k / i - 1;// 构造p = a + b,q = a * b// 对应二次方程:x^2 - p*x + q = 0int p = a + b;int q = a * b;// 输出满足条件的一组p和qcout << p << " " << q << "\n";return 0; // 输出后直接结束程序}}// 如果没有找到任何满足条件的(a, b),输出-1cout << -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; // 输入层数 nint s = 0; // s 为所有节点数总和// 读取每层的节点数,并计算前缀和 b[i],以及总节点数 sfor(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"; // 输出根节点的编号为 1int 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; // 当前父节点的左儿子设为 nodef = 1; // 下一次连接右儿子cnt++; // 已连接一个子节点} else {r[fu] = node; // 当前父节点的右儿子设为 nodef = 0; // 下一个父节点开始连接左儿子cnt++; // 已连接第二个子节点}if(cnt == 2) { // 如果当前父节点已经连接两个儿子fu++; // 切换到下一个父节点cnt = 0; // 重置计数}node++; // 准备分配下一个新节点}fu = b[i-1] + 1; // 更新 fu 为当前层第一个父节点的编号(第 i-1 层的第一个节点编号 + 1)}// 输出每个节点的左右儿子编号,如果没有则输出 -1for(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"; // 输出结果}
}