ACM题解|牛客周赛 Round 37
🔥博客介绍`: EvLast
🎥系列专栏: <<数据结构与算法>> << 算法入门>> << C++项目>>
🎥 当前专栏: << 牛客周赛>>
专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆
❤️感谢大家点赞👍收藏⭐评论✍️
学习目标:
今日学习打卡
- ACM题解
❤️学习时间:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
🥰学习内容:
- 雾之湖的冰精
- 博丽神社的巫女
- 红魔馆的馆主
- 迷途之家的大贤者
- 魔法之森的蘑菇
- 三途川的摆渡人
😎内容详细:
雾之湖的冰精
题目考点: 语言题
解题思路: 输入 n, m 如果 n + m 大于 9 输出 NO 小于 9 输出 YES
#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
using ll = long long;
class Solution {
public:
void solve() {
int n,m;std::cin >> n >> m;
if (n + m > 9) {
std::cout << "No\n";
return ;
}
std::cout << "Yes\n";
}
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().solve();
#else
Solution().solve();
#endif
return 0;
}
博丽神社的巫女
解题思路: 将数组排序,然后逐步比较当数组a[i]大于 x 时 则前面的数据为满足魔女的最大数,注意下标从 0 开始 数量为 j + 1
#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
using ll = long long;
class Solution {
public:
void solve() {
int n,x; std::cin >> n >> x;
std::vector<ll> a(n);
for (auto & x: a) std::cin >> x;
std::sort(a.begin(),a.end()); // 排序
ll j = -1;
for (int i = 0; i < n; i++) {
if (x >= a[i]) { //比交大小只要大于输出下标 + 1即最大魔女数
j = i;
}
}
if (j == -1) {
std::cout << 0 <<" "<< x << endl;
} else {
std::cout << j + 1 << " " << x - a[j] << endl;
}
}
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().solve();
#else
Solution().solve();
#endif
return 0;
}
红魔馆的馆主
思路: 对 n 取模, 然后将取模数的当成前缀,去 495 的倍数中找与之相等前缀的公倍数,这样就能找到答案,然后输出后面的几个数即答案
#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define mod 495
using ll = long long;
using namespace std;
class Solution {
public:
void solve() {
ll n; std::cin >> n;
if (n % mod == 0) {
std::cout << -1 << endl;
}
std::string t = to_string(n % mod); // 取模,这个什么神器的思路?
ll b = t.size();
for (ll i = 1; ; i++) {
ll m = mod * i;
std::string k = std::to_string(m);
if (k.substr(0,b) == t) {
std::cout << k.substr(b) << endl;
return ;
}
}
}
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().solve();
#else
Solution().solve();
#endif
return 0;
}
思路2 : 深度优先搜索
#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
using ll = long long;
using namespace std;
class Solution {
public:
void solve() {
ll n; std::cin >> n;
if (n % 495 == 0) {
std::cout << -1 << endl;
return ;
}
ll tmp = n;
for (ll i = 1; i <= 4; i++) {
if (dfs(i,0,n)) break;
}
std::cout << path << "\n";
} // dfs遍历查找区间
bool dfs(ll cur, ll depth, ll t) {
if (cur == depth) {
if (t % 495 == 0) return true;
return false;
}
for (ll i = 0; i <= 9; i++) {
path += to_string(i);
ll tm = ((t % 495 * 10 % 495) + i ) % 495;
if (dfs(cur, depth + 1, tm)) return true;
path.pop_back();
}
return false;
}
private:
std::string path = "";
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().solve();
#else
Solution().solve();
#endif
return 0;
}
迷途之家的大贤者
思路: 每次都取最优,上次最大的然后留下边界最小的让后面没有办法操作
#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 1000
using ll = long long;
int dp[10]; // 0 - 9的下标
class Solution {
public:
void solve() {
std::string s; ll n;
std::cin>>n>>s;
std::cout << std::max(s[0],s.back());
return ;
}
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().Solve();
#else
Solution().solve();
#endif
return 0;
}
魔法之森的蘑菇
思路: 创建3位数组,进行 bfs遍历, 每一层数组只能往一个方向运动, 当遇到 ‘#’ 时 进入到对应的层 进行运动
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N = 1010;
char g[N][N][4];
int px[4] = {-1,0,1,0};
int py[4] = {0,1,0,-1};
int dp[N][N][4];
void solve()
{
int n,m; cin >> n >> m;
int sx,sy,ex,ey;
memset(dp,0x3f,sizeof dp);
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
{
char c; cin >> c;
for(int p = 0 ; p < 4 ; p ++)
g[i][j][p] = c;
if(g[i][j][1] == 'S')
sx = i,sy = j;
if(g[i][j][1] == 'T')
ex = i,ey = j;
}
for(int i = 0 ; i < 4 ; i ++)
dp[sx][sy][i] = 0;
queue<vector<int>> q;
for(int i = 0 ; i < 4 ; i ++)
q.push({sx,sy,i});
while(q.size())
{
auto t = q.front();
q.pop();
int x = t[0],y = t[1],p = t[2];
int xx = x + px[p] ,yy = y + py[p];
if(xx <= 0 || xx > n || yy <= 0 || yy > m || g[xx][yy][p] =='#')
continue;
if(g[xx][yy][p] == '.')
{
if(dp[xx][yy][p] > dp[x][y][p] + 1)
{
dp[xx][yy][p] = dp[x][y][p] + 1;
q.push({xx,yy,p});
}
}
else
{
for(int i = 0 ; i < 4 ; i ++)
{
//if((i ^ p) == 0) continue;
if(dp[xx][yy][i] > dp[x][y][p] + 1)
{
dp[xx][yy][i] = dp[x][y][p] + 1;
q.push({xx,yy,i});
}
}
}
}
int res = 0x3f3f3f3f;
for(int i = 0 ; i < 4 ; i ++)
res = min(dp[ex][ey][i],res);
if(res != 0x3f3f3f3f) cout << res << '\n';
else cout << -1 << '\n';
}
int main()
{
int t; cin >> t;
while( t --)
{
solve();
}
}
三途川的摆渡人
思路: 用桶的思想存储每个数据,然后对数据进行类背包dp , 当然也可以回溯算法进行解决
#include<bits/stdc++.h>
#define Run 1
#define endl "\n"
#define mod 495
using ll = long long;
using namespace std;
class Solution {
public:
void solve() // 类背包dp 某值区较小
{
int n,x; std::cin >> n;
std::memset(tong, 0, sizeof tong);
for (int i = 0; i < n; i++) std::cin >> x,tong[x]++;
std::memset(dp,0x3f,sizeof dp);
for (int i = 0; i <= 200; i++) {
if (tong[i]) {
dp[i][1] = 1;
for (int j = 0; j <= 200; j++) {
dp[i & j][1] = std::min(dp[i & j][1],dp[j][0] + 1);
}
for (int j = 0; j <= 200; j++) {
dp[j][0] = dp[j][1];
}
}
}
if (dp[0][0] > n) std::cout << -1 << '\n';
else std::cout << n - dp[0][0] << '\n';
}
private:
int tong[202];
int dp[202][2];
};
signed main() {
std::cin.tie(0) -> std::ios::sync_with_stdio(false);
std::cout.tie(0) -> std::ios::sync_with_stdio(false);
#if Run
int _;std::cin>>_;while(_--) Solution().solve();
#else
Solution().solve();
#endif
return 0;
}
😘学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 3 篇
- 习的 vlog 视频 1 个
- 周赛视频教学: 牛客周赛 Round 37
- 相关周赛代码仓库: 牛客周赛 Round 37 代码
重磅消息:
GTP - 4 最新版接入服务他来了 点击链接即可查看详细
GTP - 4 搭建教程
🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~