AtCoder Beginner Contest 276 (A~E)
admin
2024-01-25 03:31:42
0

A. Rightmost(遍历)

题意:

给定一个全是小写字母的字符串,问最后一个 a 出现的位置。

思路:

遍历字符串,有 a 就更新位置,没有则输出 -1.

代码如下:

#include 
using namespace std;int main()
{string s;cin >> s;int len = s.size();int res = -1;for (int i = 0; i < len; i++){if (s[i] == 'a')res = i + 1;}cout << res << endl;return 0;
}

B. Adjacency List(排序)

题意:

给定 n 个点(编号从 1 ~ n)和 m 条边,每条边连接两个顶点。要求判断每个顶点所对应的边数,若有则输出边数并将所能到达的点按编号升序输出,否则输出 0.

思路:

二维 vector 存储每个点所连的边,并将每条边对应的点依次从小到大排序即可。

代码如下:

#include 
#define ll long long
using namespace std;
const int N = 2e5 + 10;vector v[N];int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= m; i++){int a, b;cin >> a >> b;v[a].push_back(b);v[b].push_back(a);}for (int i = 1; i <= n; i++){sort(v[i].begin(), v[i].end());}for (int i = 1; i <= n; i++){if (v[i].size() == 0){cout << 0 << endl;}else {cout << v[i].size() << ' ';for (int j = 0; j < v[i].size(); j++)cout << v[i][j] << ' ';cout << endl;}}return 0;
}

C. Previous Permutation(全排列)

题意:

给定 n,接着给定一个长度为 n 的全排列,要求输出该全排列的按 字典序 排列的上一个全排列。

思路:

按字典序排列的全排列,必定是依次对于每个数的升序排列,所以只需要找到非升序排列的元素位置,将其替换为上一个数,而后面的数按照降序来排列即可。

先遍历一遍,找到最后一个 前一个元素大于后一个元素 的位置,记录下前一个数的位置 pos ,接着从后往前遍历,找到后面元素中第一个小于 a[pos] 的数,交换两个数,再对 a[pos] 后面的全部元素按降序排列即可。

代码如下:

#include 
using namespace std;
const int N = 310;int a[N];int main()
{int n;cin >> n;int pos = 0;for (int i = 1; i <= n; i++){cin >> a[i];if (a[i - 1] > a[i]){pos = i - 1;}}for (int i = n; i >= 1; i--){if (a[i] < a[pos]){swap(a[i], a[pos]);break;}}sort(a + pos + 1, a + n + 1, greater());for (int i = 1; i <= n; i++)cout << a[i] << ' ';cout << endl;return 0;
}

当然 C++ 强大的 STL 提供了一种直接跳题的方法:

next_permutation() 用于求前一个全排列

prev_permutation() 用于求后一个全排列(均按照字典序排列)

如果排的是结构体需要重载 < 运算符

代码如下所示:

#include 
using namespace std;
const int N = 310;int main()
{int n;cin >> n;vector v;for (int i = 0; i < n; i++){int x;cin >> x;v.push_back(x);}prev_permutation(v.begin(), v.end());for (auto x : v)cout << x << ' ';cout << endl;return 0;
}

D. Divide by 2 or 3(分解质因数)

题意:

给定 n 个数 a1∼ana_1∼a_na1​∼an​ ,一次操作可以任选一个数除以 23 ,要求使得所有数都相等的最小操作次数。

思路:

首先,使得所有数都相等的最优方案一定是它们的 最大公约数,所以我们先将整体的最大公约数求出来。

然后对于剩下的数,依次进行拆分,分别除以 23 并记录次数,如果能被完全分解则代表满足要求,输出次数即可。只要有一个数不能被完全分解,则代表不可行,输出 -1.

代码如下:

#include 
#define ll long long
using namespace std;
const int N = 1010;int gcd(int a, int b)  //辗转相除法求最大公约数
{return b ? gcd(b, a % b) : a;
}int a[N];int main()
{int n;cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int g = 0;for (int i = 1; i <= n; i++)g = gcd(g, a[i]);int f = true;int res = 0;for (int i = 1; i <= n; i++){a[i] /= g;while (a[i] % 2 == 0){a[i] /= 2;res++;}while (a[i] % 3 == 0){a[i] /= 3;res++;}if (a[i] != 1) f = false;}if (f) cout << res << endl;else cout << -1 << endl;return 0;
}

E. Round Trip(DFS)

题意:

给定一个大小为 n × m 的网格图,起点为 S,道路为 .,障碍物为 #

每次只能上下左右四个方向移动,询问是否能够从起点出发,不经过重复的点回到起点。

思路:

DFS 搜索即可。

用二维数组 mp[N][N] 存图,用 vis[N][N] 作为标记数组,表示走过的点。

先在起点判断四个方向是否可走,再用 DFS 从四个方向依次搜索即可。

代码如下:

#include 
#define ll long long
using namespace std;
const int N = 3e4 + 10;int n, m;
char mp[N][N];
bool vis[N][N];
int sx, sy;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};bool dfs(int x, int y, int res)
{if (vis[x][y] || mp[x][y] == '#') return false;if (x == sx && y == sy && res > 1) return true;vis[x][y] = true;for (int i = 0; i < 4; i++){int xx = x + dx[i], yy = y + dy[i];if (xx >= 1 && xx <= n && yy >= 1 && yy <= m){if (xx == sx && yy == sy && res == 0) continue;if (mp[xx][yy] == '#' || mp[x][y] == '#') continue;if (dfs(xx, yy, res + 1)) return true;}}return false;
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> mp[i][j];if (mp[i][j] == 'S'){sx = i;sy = j;}if (mp[i][j] == '#')vis[i][j] = true;}}for (int i = 0; i < 4; i++){int x = sx + dx[i], y = sy + dy[i];if (x >= 1 && x <= n && y >= 1 && y <= m){if (dfs(x, y, 0)){cout << "Yes" << endl;return 0;}}}cout << "No" << endl;return 0;
}

相关内容

热门资讯

微软安卓系统叫什么,Windo... 你知道吗?在科技界,微软这个巨头最近可是搞了个大动作,竟然把目光投向了安卓系统!没错,就是那个我们日...
安卓系统没有最近任务,揭秘无最... 你是不是也遇到了这个问题?安卓系统里怎么就没有“最近任务”这个功能呢?别急,让我来给你详细说说这个事...
安卓系统怎么拒聊天,安卓系统聊... 你是不是也和我一样,有时候手机里聊天软件的消息太多,让人头都大了?别急,今天就来教你怎么在安卓系统里...
下载工资软件安卓系统,高效便捷... 你有没有想过,每个月的工资一到手,是不是就感觉整个人都轻松了呢?但是,你知道怎么轻松地管理你的工资吗...
下载灰灰影音安卓系统,畅享高清... 你有没有想过,一部手机,一部电脑,就能让你随时随地享受高清电影、热门剧集的乐趣?没错,这就是我们今天...
安卓系统是不是中国,中国智慧与... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,它是不是中国的“孩子”呢?这个问题听起来...
电脑如果安装安卓系统,探索安卓... 你有没有想过,如果家里的电脑突然决定要换换口味,不再坚守Windows的阵营,而是拥抱安卓系统呢?想...
安卓手机升级苹果系统,体验全新... 你有没有想过,你的安卓手机突然间变成了苹果的忠实粉丝,想要体验一番iOS系统的魅力呢?这可不是天方夜...
安卓系统短信不通知,享受宁静 你是不是也遇到了这个问题?安卓系统短信不通知,是不是让你抓狂?别急,今天就来给你详细解析一下这个让人...
夏普电视非安卓系统,非安卓系统... 亲爱的读者们,你是否曾对夏普电视的非安卓系统感到好奇呢?今天,就让我带你一探究竟,揭开这个神秘面纱背...
安卓系统43适配软件,软件升级... 你有没有发现,你的安卓手机最近是不是有点儿“水土不服”?别急,别急,让我来给你揭秘为什么你的安卓系统...
安卓系统有车载系统吗吗,智能驾... 你有没有想过,当你坐在车里,享受着旅途的悠闲时光,手机上的安卓系统是不是也能派上用场呢?没错,我就要...
安卓8.1系统解锁方法,畅享自... 你有没有想过,你的安卓手机里隐藏着无数的小秘密?比如,解锁安卓8.1系统,就能让你的手机焕发出全新的...
安卓系统怎么打开邮件,安卓系统... 你有没有想过,每天那么多邮件,怎么才能快速打开它们呢?尤其是当你用的是安卓系统手机的时候。别急,今天...
封闭安卓系统安装软件,一步到位... 你有没有想过,为什么你的安卓手机里有些软件只能通过官方渠道安装呢?今天,就让我带你一探究竟,揭开封闭...
小米mipad升级安卓系统,解... 你有没有发现,最近小米Mipad的安卓系统升级可是个大热门呢!这不,我就迫不及待地来和你聊聊这个话题...
哪个安卓系统体验好,揭秘安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的版本就是不同的拿手好菜,有的让你回味无穷,有的却让...
安卓系统开发测试,全方位技术解... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,是怎么从无到有,一步步成长起来的呢?今天...
安卓系统怎么查配置,轻松掌握设... 你有没有想过,你的安卓手机里藏着多少秘密?别小看这些配置信息,它们可是了解你手机性能的“小侦探”呢!...
pve下安装安卓系统,PVE环... 你有没有想过,在你的PVE服务器上安装一个安卓系统呢?听起来是不是有点酷炫?想象你的服务器不仅能够运...