AtCoder_abc335

发布时间 2024-01-07 12:41:20作者: Tom-catlll

A、2023

跳转原题点击此:A题地址

1、题目大意

  给你一个字符串,要你对该字符串的最后一个字符改为4。

2、题目解析

  直接通过string的性质即可,直接更改string的最后一个字符即可。

3、具体代码

#include<bits/stdc++.h>

using namespace std;

int T;
string s;	

void solve()
{
	cin >> s;
	s[s.size() - 1] = '4';
	cout << s << endl;
}

int main()
{
	solve();

	return 0;
}

 

B、Tetrahedral Number

跳转原题点击此:B题地址

1、题目大意

  生成一个类似全排列的序列。即对给定的n生成0\(\sim\)n的3元全排列。其要求是\(a + b + c \le n\)
且,对于新的全排列(x,y,z)和前一个全排列(x',y',z')的要求是:

  • \(x < x'\);
  • \(x=x'\) and \(y< y'\);
  • \(x=x'\) and \(y=y'\) and \(z< z'\)

2、题目解析

  由于只有三位且n的范围只有22,所以直接通过暴力枚举即可。当然注意具体要求即可。

3、具体代码

#include<bits/stdc++.h>

using namespace std;

int n;
int a, b, c;

void solve()
{
	scanf("%d", &n);
	a = b = c = -1;	// 更新为上一个的全排列
	for(int i = 0; i <= n; i++)
	{
		for(int j = 0; j <= n; j++)
		{
			for(int k = 0; k <= n; k++)
			{
				if(i + j + k > n)
					continue;
				if(i > a || j > b || k > c)
					printf("%d %d %d\n", i, j, k);
				a = i, b = j, c = k;	// 更新为上一个的全排列
			}
		}
	}
}

int main()
{
	solve();

	return 0;
}

 

C、Loong Tracking

跳转原题点击此:C题地址

1、题目大意

  一条龙在x轴上,龙头坐标点为(1,0),给定你若干个处理条件和查询条件:
1、给定四个方位(上、下、左、右)中的其中一个,随后龙头按照该方位移动一格,其身后的其他格子也跟随移动。
2、查询模块即查询最开始的身体的某个格子在经过几个操作后(可能为零个)后在哪里。

2、题目解析

  只要创建一个pair的数组,将通过四个方位移动后的几个操作都按照顺序存入该数组即可。随后记录在每个查询前经过的多少次移动操作,即移动操作数量就是之后的新区域的坐标:注意新的坐标可能是最开始已经被占据的点,也可能是四个方位新生成的点,具体看代码:

3、具体代码

#include<bits/stdc++.h>

using namespace std;

#define _1 first
#define _2 second

typedef long long ll;
typedef pair<int, int>pii;
const int N = 2e5+10;

int n, q;
pii f[N];

void solve()
{
	int x = 1, y = 0, sum = 0, cnt = 0;
	cin >> q >> n;
	for(int i = 1; i <= n; i++)
	{
		int tmp;
		cin >> tmp;
		if(tmp == 1)
		{
			char ss;
			cin >> ss;
			if(ss == 'D')
				y--;
			else if(ss == 'U')
				y++;
			else if(ss == 'L')
				x--;
			else if(ss == 'R')
				x++;
			sum++;
			f[cnt ++] = {x, y};
		}
		else
		{
			int loc;
			cin >> loc;
			if(sum < loc)	// 如果该查询之前的总操作数是在原先已经被占据的坐标点上
				cout << loc - sum << " " << 0 << endl;
			else	// 如果该查询之前的总操作数是在新生成的坐标点上
			{
				cout << f[sum - loc]._1 << " " << f[sum - loc]._2 << endl;
			}
		}
	}

}

int main()
{
	solve();

	return 0;
}

 

D、 Loong and Takahashi

跳转原题点击此:D题地址

1、题目大意

  原文的意思比较难翻译,换句话说就是生成一个螺旋递增向内的正方形,其中正方形最中心要更新为字符'T'。

2、题目解析

  先生成一个螺旋递增向内的正方形,然后将中心换为T即可。
生成思路:将正方形分别看出若干个正方形环包围的图形:依次按照上、右、下、左地生成正方形地四条边。注意:会有重复点,所以要剔除。

3、具体代码

#include<bits/stdc++.h>

using namespace std;

const int M = 50;

int T;
int n, m, idx = 1;
int f[M][M];

void solve()
{
	cin >> n;
	m = n / 2 + 1;
	for(int i = 1; i <= m; i++)
	{
		for(int j = i; j <= n - i + 1; j++)	// 上面一行
			f[i][j] = idx++;
			
		for(int j = i + 1; j <= n - i + 1; j++)	// 右边一列
			f[j][n - i + 1] = idx++;
			
		for(int j = n - i; j >= i; j--)	// 下面一行
			f[n - i + 1][j] = idx++;
			
		for(int j = n - i; j > i; j--)	// 左边一行
			f[j][i] = idx++;
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(i == m && j == m)
			{
				cout << "T" << " ";
				continue;
			}
			cout << f[i][j] << " ";
		}
		cout << endl;
	}
	
}

int main()
{
	solve();
	return 0;
}

 

E、F、G不会,等我足够强了再回来补。