CSDN竞赛第25期题解
Posted 酷酷的Herio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN竞赛第25期题解相关的知识,希望对你有一定的参考价值。
CSDN竞赛第25期题解
1、题目名称:分层遍历二叉树
给定一棵二叉树,节点定义如下: structNode Node *pLeft; Node *pRight; int data; ; 要求按分层遍历该二叉树,
即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
class TreeNode
public:
int val;
TreeNode *left, *right;
TreeNode(int val)
this->val = val;
this->left = this->right = NULL;
;
class Solution
public:
TreeNode * str2tree(string &s)
if(s.empty() == true)
return NULL;
stack<TreeNode *> stk;
for(int i = 0; i < s.size(); i++)
// 因为这里需要记录最开始的位置,方便后面提取数字
1.out 通过
int pos = i;
if(s[i] == ')'||s[i]==',')
if(s[i]==','&&s[i+1]==')') continue;
//if(!stk.empty()&&(s[i-1]!='(')&&s[i-1]!=',')
stk.pop();
else if((s[i] >= '0' && s[i] <= '9') || s[i] == '-')
//while循环这里是检查数字是否是多位的
while(s[i + 1] >= '0' && s[i] <= '9')
i++;
int value = stoi(s.substr(pos, i - pos + 1));
TreeNode *node = new TreeNode(value);
if(!stk.empty())
TreeNode *parent = stk.top();
if(parent->left == NULL)
parent->left = node;
else
parent->right = node;
stk.push(node);
else if(s[i]=='(')
if(s[i+1]==',')
i=i+2;
//最后栈里面只有root一个元素
return stk.top();
so;
int mx = 0;
map<int,vector<int> >v;
void dfs(TreeNode*rt,int dep)
if(rt==nullptr) return;
//printf("%d %d\\n",rt->val,dep);
mx=max(mx,dep);
v[dep].pb(rt->val);
dfs(rt->left,dep+1);
dfs(rt->right,dep+1);
int main()
string s;cin>>s;
TreeNode *rt=new TreeNode(0);
rt = so.str2tree(s);
dfs(rt,1);
int idx=1;
for(int i=1;i<=mx;i++)
for(int x:v[i])
printf("%d ",x);
puts("");
return 0;
2、题目名称:查找整数
给定一个非降序的整数数组,数组中包含重复数字(重复数字很多) ,给定任意整数,对数组进行二分查找,返回数组正
确的位置,给出函数实现。 a. 连续相同的数字,返回最后一个匹配的位置 b. 如果数字不存在返回 -1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
1.out 通过
2.out 通过
3.out 通过
4.out 通过
5.out 通过
6.out 通过
7.out 通过
运行时间:
占用内存:19.441k
运行时间:
占用内存:19.445k
运行时间:
占用内存:19.445k
运行时间:
占用内存:19.445k
运行时间:
占用内存:19.445k
运行时间:
占用内存:19.445k
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
int main()
int n,x;cin>>n>>x;
int pos = -1;
for(int i=1;i<=n;i++)
int y;cin>>y;
if(y==x) pos = i-1;
cout<<pos<<'\\n';
return 0;
3、题目名称:小Q整数分割
小Q决定把一个整数n,分割为k个整数。 每个整数必须大于等于1。 小Q有多少方案。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n)
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y)
if(x<y) x=y;
template <typename T>
void cmn(T &x,T y)
if(x>y) x=y;
ll a[N][N];
int main()
int n,m;cin>>n>>m;
if(n<m) return puts("0"),0;
1.out 通过
2.out 通过
3.out 通过
4.out 通过
5.out 通过
6.out 通过
7.out 通过
8.out 通过
9.out 通过
10.out 通过
运行时间:
占用内存:11.133k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
运行时间:
占用内存:11.137k
if(n==m) return puts("1"),0;
for(int i=1; i<=n; i++)
a[i][1] = 1;
for(int i=1; i<=n; i++)
for(int j=1;j<=min(m,i);j++)
if(i > j)
a[i][j] = (a[i-1][j-1] + a[i-j][j])%mod;
else
a[i][j] = 1;
cout<<a[n][m]%mod<<'\\n';
return 0;
4、题目名称:水池注水
给定nn水池。 向nn水池中注水。 每行每列只能注水一个方格。 如果一个方格的四周有两个方格已经被水覆盖,则该方
格也会被水覆盖。 小Q想知道自己有多少种方案可以使得自己·的水池被完全覆盖。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
以上是关于CSDN竞赛第25期题解的主要内容,如果未能解决你的问题,请参考以下文章