输出描述:
输出一行
n
n
n个正整数,代表小红构造的二叉树的层序遍历的序列。
示例1
输入
4
输出
2 4 3 1
说明
这棵树的结构如下:
2
/
4 3
/
1
显然,任意节点和它父亲权值的乘积都是偶数
思路:
奇数节点全部放叶子上 剩下的放偶数节点
AC代码:
#include
using namespace std;
int n;
int main()
{
cin >> n;
vector tr(n + 1, 0);
vector odd, even;
for(int i = 1; i <= n; i++)
{
if(i % 2 == 0) even.push_back(i);
else odd.push_back(i);
}
for(int i = n; i > 0; i--)
{
if(odd.empty())
{
tr[i] = even.back();
even.pop_back();
}
else
{
tr[i] = odd.back();
odd.pop_back();
}
}
for(int i = 1; i <= n; i++) cout << tr[i] << " ";
return 0;
}
第四题:过沼泽地
题目描述:
小红来到了一片沼泽地的岸边,她希望能通过这片沼泽地。
这个沼泽地地图用一个矩阵进行表示。1代表沼泽,0代表平地。小红刚开始在矩阵的左上角,她需要从右下角离开地图。已知进入地图和离开地图的时间可以忽略。小红可以向左、向右或者向下走。
当小红从沼泽进入沼泽,或者平地进入平地时,需要花费1单位时间。
当小红从沼泽进入平地,或者平地进入沼泽,由于需要更换装备,所以要花2单位时间。
小红可以从左上角进入地图,从右下角离开地图。
小红想知道,经过这片沼泽地,最少需要花费多少单位时间。
输入描述:
第一行输入两个正整数
n
n
n 和
m
m
m,用空格隔开,代表矩阵的行数和列数。
接下来的
n
n
n 行,每行输入
m
m
m 个正整数
a
i
,
j
a_{i,j}
ai,j,用来表示矩阵。
2
≤
n
,
m
≤
500
,
0
≤
a
i
,
j
≤
1
2leq n,mleq500 , 0leq a_{i,j}leq1
2≤n,m≤500,0≤ai,j≤1
输出描述:
输出一个正整数,代表经过沼泽地的最少时间。
示例1
输入
3 3
1 0 0
1 1 1
0 0 1
输出
4
说明
从左上角进入,往下走一次,往右走两次,往下走一次,到右下角。后花费4单位时间。
可以证明,这样花费的时间一定是最小的。
思路:
正常DP即可
AC代码
#include
using namespace std;
const int N = 510;
int n,m;
int g[N][N];
int f[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
memset(f,0x3f,sizeof f);
f[1][1] = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j + 1 <= m) f[i][j] = min(f[i][j], f[i][j + 1] + (g[i][j] == g[i][j+1] ? 1 : 2));
if(i - 1 >= 0) f[i][j] = min(f[i][j], f[i - 1][j] + (g[i][j] == g[i - 1][j] ? 1 : 2));
if(j - 1 >= 0) f[i][j] = min(f[i][j], f[i][j - 1] + (g[i][j] == g[i][j - 1] ? 1 : 2));
}
}
cout<