蓝桥云课刷题210523
Posted ~千里之行,始于足下~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥云课刷题210523相关的知识,希望对你有一定的参考价值。
今天用又是准备国赛的一天,用蓝桥云课练了几道题,欢迎指正
1.小蓝有一条玩具蛇,一共有 1616 节,上面标着数字 1至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
图片描述
请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
分析:这个题就是常规的dfs搜索,递归的入口是16个格子的任意一格,相邻的两节呈直线或90度角意思是任意一个格子(入口)上下左右搜索,直到这16个格子全部走完即为一种方案,走不下去就回溯回去。
#include<iostream>
#include<cstring>
using namespace std;
//https://www.lanqiao.cn/problems/1022/learning/
//该题链接
int dir[4][2] = { 1,0,-1,0,0,1,0,-1 };//二位数组的上下左右
//int dir[5] = {-1,0,1,0,-1};//一维数组
int visit[5][5];//设访问标志位,开始全为0,即为未访问
long long cnt;//计数
//x为横坐标,y为竖坐标,step为当前节数
void dfs(int x, int y, int step)
{
if (step == 16)//全部放下
{
cnt++;
return;
}
for (int i = 0; i < 4; i++)//i < 4 注意边界
{
//更新坐标
int xx = dir[i][0] + x;
int yy = dir[i][1] + y;
//int xx = dir[i] + x;
//int yy = dir[i+1] + y;
//if (xx < 1 || xx > 4 || yy < 1 || yy > 4 || visit[xx][yy]) continue;
if (xx >= 1 && xx <= 4 && yy >= 1 && yy <= 4 && visit[xx][yy] == 0)
{
visit[xx][yy] = 1;//设该点已访问
dfs(xx, yy, step+1);//节数加1
visit[xx][yy] = 0;//回溯
}
}
}
int main()
{
for (int i = 1; i <= 4; i++)
for (int j = 1; j <= 4; j++)
{
//存在玩具蛇的某一节放在了盒子的不同格子里
//,则认为是不同的方案。
// dfs的入口,即16个格子的任一各
memset(visit, 0, sizeof(visit));
//每次dfs先把标志为初始化为0
visit[i][j] = 1;
dfs(i,j,1);
}
cout << cnt << endl;
return 0;
}
2.
网址:https://www.lanqiao.cn/problems/1025/learning/
分析:刚开始没有理解题意,题中所说的发消息时间之和最小是什么意思,不是忽略掉发消息时间吗。
其实是第一位同学发消息时间为他s+a,第二为同学发消息时间为前面同学所用总时间加上自己的s+a,所以要是总的发消息时间最少,必须按每一个同学所用总时间一次排序。
#include<iostream>
#include<algorithm>
using namespace std;
struct time
{
long long s;//进入办公室时间
long long a;//答疑时间
long long e;//离开办公室时间
long long sum;//总的时间
};
struct time t[1001];
int sortHelper(struct time t1, struct time t2)
{
return t1.sum < t2.sum;//降序
}
int main()
{
int n = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> t[i].s >> t[i].a >> t[i].e;
t[i].sum = t[i].s + t[i].a + t[i].e;
}
sort(t,t+n,sortHelper);//排序
long long sum = 0;
// for (int i = 0; i < n; i++)
// {
// cout << t[i].s << " " << t[i].a << " " << t[i].e << " " << t[i].sum << endl;
// }
for (int i = 0; i < n; i++)
{
long long temp = 0;
for (int j = 0; j < i; j++)
{
temp += t[j].sum;//前面同学所用总时间
}
sum = sum + temp + t[i].s + t[i].a;//加上s+a
}
cout << sum << endl;
return 0;
}
3.一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 31,2,3 不是合数,4, 64,6 是合数。
请问从 1 到 2020 一共有多少个合数。
运行限制
最大运行时间:1s
最大运行内存: 128M
链接:https://www.lanqiao.cn/problems/1028/learning/合数个数
分析:这道题目很简单,但一开始结果就是不正确
素数就是除了1和它本身没有其他约数,所以合数就是求不是素数的个数。
#include<iostream>
#include<cmath>
using namespace std;
int isPrime(int n)
{
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0) return 0;
}
return 1;
}
int main()
{
int cnt = 0;
for (int i = 1; i <= 2020; i++)
{
if (!isPrime(i)) cnt++;
}
cout << cnt << endl;
return 0;
}
以上是关于蓝桥云课刷题210523的主要内容,如果未能解决你的问题,请参考以下文章