零点工作室暑假集训(AtCoder--ABC258)

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;
}
    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值