A - When?
题意:AtCoder Beginner Contest通常在JST时间21:00开始,持续100分钟。给定一个介于0和100(包括边界)的整数K。以HH:MM的格式打印在21:00之后K分钟的时间,其中HH表示24小时制的小时,MM表示分钟。如果小时或分钟只有一位数字,则在开头添加0以表示为2位整数。
思路:考察if语句的分支运用,判断一下t < 60的情况,以及t > 60的情况。还需要考虑HH:WW中WW小于10时前面加个字符 0,变成2位数。有两种做法第二种是输出%02d,也可以保证2位
AC代码:
1.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int k, a = 21, b = 0;
int main()
{
cin >> k;
if(k < 10) cout << a << ":" << '0' << k;
if(k < 60 && k >= 10) cout << a << ":" << k;
if(k >= 60 && k % 60 < 10) cout << a + 1 << ":" << '0' << k % 60;
if(k >= 60 && k % 60 >= 10) cout << a + 1 << ":" << k % 60;
return 0;
}
2.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin >> n;
if(n < 60)
{
cout << "21:";
printf("%02d", n);
}
else
{
cout << "22:";
printf("%02d", n-60);
}
return 0;
}
B - Number BOX
题意:给定一个正整数 N。
我们有一个具有 N 行和 N 列的方格网格,其中从顶部开始的第 i 行和从左侧开始的第 j 列的方块上有一个数字 Ai,j。假设该网格的上边和下边相连,以及左边和右边相连。换句话说,以下所有情况都成立:
(N, i) 在 (1, i) 的正上方,(1, i) 在 (N, i) 的正下方。(1≤i≤N)。
(i, N) 在 (i, 1) 的正左侧,(i, 1) 在 (i, N) 的正右侧。(1≤i≤N)。
高桥先选择八个方向之一:上、下、左、右以及四个对角线方向之一。然后,他选择一个起始方块,按照所选方向重复向前移动 N-1 次。
在这个过程中,高桥访问了 N 个方块。找出高桥从左到右按他访问的顺序组成的数字最大可能的整数值。
思路:
1.选择一个起始方块,设为当前方块。
2.选择一个方向进行移动:上、下、左、右以及四个对角线方向之一。
3.遍历 N-1 次,每次移动到相邻方块上。
4.记录遍历过的方块上的数字,并按遍历的顺序组成数字。
5.找到组成的数字的最大值
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 20;
LL a[N][N];
char s[N][N];
int dx[8] = {1, -1, 1, -1, 1, -1, 0, 0};
int dy[8] = {1, 1, -1, -1, 0, 0, 1, -1};
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ )
{
cin >> s[i];
for (int j = 0; j < n; j ++ )
{
a[i][j] = s[i][j] - '0';
}
}
LL now = 0;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
{
for (int q = 0; q < 8; q ++ )
{
LL temp = a[i][j];
int x = i, y = j;
for (int k = 1; k < n; k ++)
{
x = (x + dx[q] + n) % n;
y = (y + dy[q] + n) % n;
temp = temp * 10 + a[x][y];
}
now = max(now, temp);
}
}
}
cout << now;
return 0;
}
C - Rotation
题意:
给定正整数 N 和 Q,以及一个长度为 N 的字符串 S,其中包含小写英文字母。
进行 Q 个查询。每个查询可以是以下两种类型之一:
1 x:连续执行以下 x 次操作:删除字符串 S 的最后一个字符,并将其添加到开头。
2 x:打印字符串 S 的第 x 个字符。
思路:由于题目只要求输出字符串中指定位置的一个字符,设给定的字符串首尾相接。对于操作1,每一次这样的操作就相当于把字符串的起始位置往前移动x个字符。
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 500010;
int n, q, op, x;
string s;
int a[N], b[N], c[N];
int main()
{
cin >> n >> q;
cin >> s;
int head = 0;
while (q --)
{
cin >> op >> x;
if(op == 1)
{
head = (head - x + 2 * n) % n;
}
else
{
cout << s[(head + x - 1) % n] << endl;
}
}
return 0;
}