首页 > 其他分享 >AtCoder Beginner Contest 387

AtCoder Beginner Contest 387

时间:2025-01-11 13:22:47浏览次数:1  
标签:AtCoder return Beginner int 代码 long mxn solve 387



A - Happy New Year 2025

题意

给定正整数\(A,B\),求\((A+B)^2\)

思路

模拟

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;


void solve()
{
	int a, b;
	cin >> a >> b;
	cout << (a + b) * (a + b) << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}


B - 9x9 Sum

题意

有\(9×9\)的网格,\((i,j)\)的权是\(i×j\)。给定\(n\),求所有网格中权不是\(n\)的数的和。

思路

模拟

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

int cnt[100];

void solve()
{
	int n;
	cin >> n;
	if (n > 81)
	{
		cout << 2025 << endl;
		return;
	}
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++)
		{
			cnt[i * j]++;
		}
	}
	cout << 2025 - cnt[n] * n << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}


C - Snake Numbers

题意

定义"蛇数"为:一个不小于\(10\)的数,且这个数的十进制首位严格大于其他位的数。给定区间\([L,R]\),求该区间内的"蛇数"个数

思路

将上下限转化为两个上限之差,即 \(ans([L,R])=ans([10,R])-ans([10,L-1])\)。
对于上限\(R\),枚举\(x\),当\(x\)的位数小于\(R\)的位数以及位数相等但\(x\)的首位\(<R\)的首位时,可以很容易地计算出答案;当位数相等且首位相等时,就枚举\(R\)的每一位,当能够判断\(R\)不是蛇数或枚举完时结束,注意后者需要多计\(1\)(\(R\)本身也是蛇数)。
注意:C++库中的\(pow\)在数据很大时会有精度问题(可能?反正我在这\(wa\)了一晚上),所以需要自己实现\(pow\)

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e6 + 5;

int _pow(int a, int b)
{
	int res = 1;
	while (b--)
	{
		res *= a;
	}
	return res;
}

int f(int x)
{
	if (x < 10)
	{
		return 0;
	}
	string s = to_string(x);
	int res = 0, len = s.length();
	for (int i = 1; i <= 9; i++) // 最高位
	{
		for (int j = 2; j < len; j++) // 位数
		{
			res += _pow(i, j - 1);
		}
	}
	for (int i = 1; i < s[0] - '0'; i++)
	{
		res += _pow(i, len - 1);
	}
	for (int i = 1; i < len; i++)
	{
		res += (min(s[i], s[0]) - '0') * _pow((s[0] - '0'), len - i - 1);
		if (s[i] >= s[0]) // x不是蛇形数
		{
			return res;
		}
	}
	return res + 1;
}

void solve()
{
	int L, R;
	cin >> L >> R;
	cout << f(R) - f(L - 1) << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}


D - Snaky Walk

题意

给定\(H\)行\(W\)列的网格,\(S\)代表起点,\(G\)代表终点,#代表障碍物,对每次移动进行限制:当前移动须不同于上次,即上次水平这次就要垂直。求起点到终点需要的最短步数,无解输出\(-1\)

思路

加上限制的经典\(BFS\),对于每个点需要额外记录上一次移动的状态,两次\(BFS\)即可得出答案。也可以将\(vis\)数组开成三维就不用跑两遍了,时间复杂度差不多。

代码

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;

const int mxn = 1e3 + 5;

struct node
{
	int x, y, step;
	bool d; // false代表上一步水平
};

char a[mxn][mxn];
int H, W, sx, sy, gx, gy, ans = LLONG_MAX;
int xdx[] = { 1,-1 };
int xdy[] = { 0,0 };
int ydx[] = { 0,0 };
int ydy[] = { 1,-1 };

void bfs(bool f)
{
	queue<node> q;
	vector<vector<bool>> vis(mxn, vector<bool>(mxn, false));
	q.push({ sx,sy,0,f });
	while (q.size())
	{
		int x = q.front().x, y = q.front().y, step = q.front().step;
		bool d = q.front().d;
		q.pop();
		if (x == gx && y == gy)
		{
			ans = min(step, ans);
		}
		if (vis[x][y])
		{
			continue;
		}
		vis[x][y] = true;
		for (int i = 0; i < 2; i++)
		{
			// 分水平、垂直两种走
			int tx = x + (d ? ydx[i] : xdx[i]);
			int ty = y + (d ? ydy[i] : xdy[i]);
			if (tx < 0 || ty < 0 || tx >= H || ty >= W || a[tx][ty] == '#')
			{
				continue;
			}
			q.push({ tx,ty,step + 1,!d });
		}
	}
}

void solve()
{
	cin >> H >> W;
	for (int i = 0; i < H; i++)
	{
		for (int j = 0; j < W; j++)
		{
			cin >> a[i][j];
			if (a[i][j] == 'S')
			{
				sx = i;
				sy = j;
			}
			else if (a[i][j] == 'G')
			{
				gx = i;
				gy = j;
			}
		}
	}
	bfs(false); // 先垂直
	bfs(true); //先水平
	cout << (ans == LLONG_MAX ? -1 : ans) << endl;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T = 1;
	//cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}


E - Digit Sum Divisible 2

题意

思路

代码

点击查看代码



比赛链接 https://atcoder.jp/contests/abc387

标签:AtCoder,return,Beginner,int,代码,long,mxn,solve,387
From: https://www.cnblogs.com/Seii/p/18665481

相关文章

  • 关于此题[ABC 387]C - Snake Numbers 数位DP的一些总结
    传送门这道题要求我们求[l,r]范围内所有的“蛇数”,即这个数的第一位严格大于它的其他位的数。看到数据范围并且发现答案区间可加减性联想到数位DP。其实有点类似模板题,与经典的数位DP题类似的,我们需要判断前导0,需要判断当前枚举的数是否是贴着所给的数,在此题中如果想要记忆化的......
  • VP UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 38
    A-Equally题意:给你三个数,判断能不能分成大于一组后每组和相等。只可能分成两个和一个或者三组一个的。点击查看代码voidsolve(){inta,b,c;std::cin>>a>>b>>c;if((a==b&&b==c)||(a+b==c)||(b+c)==a||(a+c)==b){ s......
  • Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]
    Stamp:难点主要在dp转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题。观察首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新覆盖回去。这也就是dp为啥没有后效性的原因。除此之外,还要注意一个字符串不仅能在......
  • VP AtCoder Beginner Contest 387
    A-HappyNewYear2025按题意输出即可。点击查看代码voidsolve(){inta,b;std::cin>>a>>b;std::cout<<(a+b)*(a+b)<<"\n";}B-9x9Sum直接遍历累加满足不等于x的数即可,注意这个九九乘法表是9*9的矩阵,不是我们学的下三角。点击查看......
  • AtCoder备赛刷题 ABC 361 | x = a^b
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】Howmanyintegersxx......
  • AtCoder备赛刷题 ABC 361 | Go Territory
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】ThereareNNNston......
  • atcoder 杂题 #05
    atcoder杂题#05abc340_gLeafColorabc340_fF-S=1abc361_gGoTerritoryabc386_fOperateKabc340_g独立想出了这道题。如果我们确定了子图的叶子,那么这个子图就确定了。又由于叶子的颜色要相同,所以每种颜色的贡献是互相独立的。首先如果一种颜色有\(x\)个点,那......
  • ABC387F
    题目还是很不错的。我们对于每一个\(i\),直接对\(a_i\)向\(i\)连一条边,很容易发现这是一个基环树。那我们直接按照套路来,考虑一个环对答案的贡献,显然环如果合法,则所有颜色相同,直接把它看成一个点即可。缩点后那剩下的解释一棵树了,我们考虑dp,设\(dp_{u,j}\)表示以\(u\)......
  • 2025 AtCoder 周寄
    目录前言\(\text{\color{#0000FF}ABC387\color{black}perf\color{#00C0C0}1398}\)前言赛时总结展望前言2024拜拜了。回首整个2024的OI历程,自己一直在摆烂。8月份的暑假基本没碰过OI,10月底的CSP-J255pts遗憾2=,11月底的NOIP连T3暴力都没来得及打,年底五中请lx......
  • AtCoder Beginner Contest 387 赛后复盘
    省流:A,B,C,D,FA-B模拟即可。C数位dp。首先我们先将问题转换为\([1,R]\)中蛇数的个数减去\([1,L-1]\)中蛇数的个数。设\(num_i\)为数字的第\(i\)位(从左往右数)。我们设\(f_{dep,mx,lim,ze}\)表示当前第\(dep\)位,首位为\(mx\),有没有达到上限,有没有前导零。那么......